EV_Toolbar_Action * EV_Toolbar_ActionSet::getAction(XAP_Toolbar_Id id) const { if ((id < m_first) || (id > m_last)) return NULL; UT_uint32 index = (id - m_first); EV_Toolbar_Action * pAction = m_actionTable[index]; UT_ASSERT(pAction && (pAction->getToolbarId()==id)); return pAction; }
bool EV_QtToolbar::synthesize(void) { // create a Qt toolbar from the info provided. const EV_Toolbar_ActionSet * pToolbarActionSet = m_pQtApp->getToolbarActionSet(); UT_ASSERT(pToolbarActionSet); XAP_Toolbar_ControlFactory * pFactory = m_pQtApp->getControlFactory(); UT_ASSERT(pFactory); UT_uint32 nrLabelItemsInLayout = m_pToolbarLayout->getLayoutItemCount(); UT_ASSERT(nrLabelItemsInLayout > 0); m_wToolbar = new QToolBar(); UT_ASSERT(m_wToolbar); Qt::ToolButtonStyle style = getStyle(); m_wToolbar->setToolButtonStyle(style); for (UT_uint32 k=0; (k < nrLabelItemsInLayout); k++) { EV_Toolbar_LayoutItem * pLayoutItem = m_pToolbarLayout->getLayoutItem(k); UT_continue_if_fail(pLayoutItem); XAP_Toolbar_Id id = pLayoutItem->getToolbarId(); EV_Toolbar_Action * pAction = pToolbarActionSet->getAction(id); UT_ASSERT(pAction); EV_Toolbar_Label * pLabel = m_pToolbarLabelSet->getLabel(id); UT_ASSERT(pLabel); const char * szToolTip = pLabel->getToolTip(); if (!szToolTip || !*szToolTip) szToolTip = pLabel->getStatusMsg(); switch (pLayoutItem->getToolbarLayoutFlags()) { case EV_TLF_Normal: { switch (pAction->getItemType()) { case EV_TBIT_PushButton: { UT_ASSERT(g_ascii_strcasecmp(pLabel->getIconName(),"NoIcon")!=0); if(pAction->getToolbarId() != AP_TOOLBAR_ID_INSERT_TABLE) { const char *icon_name = pLabel->getIconName(); QPixmap pixmap; pixmap = abi_pixmap_from_toolbar_id (icon_name); if(!pixmap.isNull()) { QIcon icon(pixmap); QString str = ""; QPushButton *item = new QPushButton(icon, str); m_wToolbar->addWidget(item); } } else { const char *icon_name = pLabel->getIconName(); QPixmap pixmap; pixmap = abi_pixmap_from_toolbar_id (icon_name); if(!pixmap.isNull()) { QIcon icon(pixmap); QString str = ""; QPushButton *item = new QPushButton(icon, str); m_wToolbar->addWidget(item); } } break; } case EV_TBIT_ToggleButton: case EV_TBIT_GroupButton: { UT_ASSERT(g_ascii_strcasecmp(pLabel->getIconName(),"NoIcon")!=0); const char *icon_name = pLabel->getIconName(); QPixmap pixmap; pixmap = abi_pixmap_from_toolbar_id (icon_name); if(!pixmap.isNull()) { QIcon icon(pixmap); QString str = ""; QPushButton *item = new QPushButton(icon, str); item->setCheckable(true); m_wToolbar->addWidget(item); } break; } case EV_TBIT_EditText: { break; } case EV_TBIT_DropDown: { break; } case EV_TBIT_ComboBox: { EV_Toolbar_Control * pControl = pFactory->getControl(this, id); UT_ASSERT(pControl); QComboBox *combo; bool isFontCombo = false; if(id == AP_TOOLBAR_ID_FMT_SIZE) { combo = new QComboBox(); } else if(id == AP_TOOLBAR_ID_FMT_FONT) { isFontCombo = true; combo = new QFontComboBox(); QString str = "AbiFontCombo"; combo->setAccessibleName(str); } else if(id == AP_TOOLBAR_ID_ZOOM) { combo = new QComboBox(); QString str = "AbiZoomCombo"; combo->setAccessibleName(str); } else if(id == AP_TOOLBAR_ID_FMT_STYLE) { combo = new QComboBox(); QString str = "AbiStyleCombo"; combo->setAccessibleName(str); } else { UT_ASSERT(0); } // populate it if (pControl) { pControl->populate(); const UT_GenericVector<const char*> * v = pControl->getContents(); UT_ASSERT(v); gint items = v->getItemCount(); if (isFontCombo) { for (gint m=0; m < items; m++) { QString str = v->getNthItem(m); combo->addItem(str); } } else { for (gint m=0; m < items; m++) { const char * sz = v->getNthItem(m); std::string sLoc; if (id == AP_TOOLBAR_ID_FMT_STYLE) { pt_PieceTable::s_getLocalisedStyleName(sz, sLoc); sz = sLoc.c_str(); } QString str = sz; combo->addItem(str); } } } m_wToolbar->addWidget(combo); // for now, we never repopulate, so can just toss it DELETEP(pControl); break; } case EV_TBIT_ColorFore: case EV_TBIT_ColorBack: { UT_ASSERT (g_ascii_strcasecmp(pLabel->getIconName(),"NoIcon") != 0); QComboBox *combo; if (pAction->getItemType() == EV_TBIT_ColorFore) { // TODO Some icon implementation const XAP_StringSet * pSS = XAP_App::getApp()->getStringSet(); std::string sClear; pSS->getValueUTF8(XAP_STRING_ID_TB_ClearForeground,sClear); combo = new QComboBox(); QString str = sClear.c_str(); combo->setAccessibleName(str); } else { // TODO Some icon implementation const XAP_StringSet * pSS = XAP_App::getApp()->getStringSet(); std::string sClear; pSS->getValueUTF8(XAP_STRING_ID_TB_ClearForeground,sClear); combo = new QComboBox(); QString str = sClear.c_str(); combo->setAccessibleName(str); } m_wToolbar->addWidget(combo); break; } case EV_TBIT_StaticLabel: { // TODO do these... break; } case EV_TBIT_Spacer: { break; } #ifdef ENABLE_MENUBUTTON case EV_TBIT_MenuButton: { break; } #endif case EV_TBIT_BOGUS: default: { break; } } break; } case EV_TLF_Spacer: { m_wToolbar->addSeparator(); break; } default: { UT_ASSERT(0); } } } QMainWindow * wTopLevel = static_cast<XAP_QtFrameImpl *>(m_pFrame->getFrameImpl())->getTopLevel(); wTopLevel->addToolBar(m_wToolbar); wTopLevel->show(); return true; }
// This is used to do the initial toolbar creation bool EV_BeOSToolbar::synthesize(void) { //Add the toolbar(s) beneath the menus ... be_Window *pBWin = NULL; if (!m_pBeOSFrame) return false; pBWin = (be_Window *)m_pBeOSFrame->getTopLevelWindow(); UT_ASSERT(pBWin); ToolbarView *tb = new ToolbarView(this, "Toolbar", B_WILL_DRAW | B_FRAME_EVENTS); tb->SetExplicitMaxSize(BSize(B_SIZE_UNSET, 32)); m_pTBView = tb; pBWin->AddChild(tb); // create a toolbar from the info provided. const EV_Toolbar_ActionSet * pToolbarActionSet = m_pBeOSApp->getToolbarActionSet(); UT_ASSERT(pToolbarActionSet); XAP_Toolbar_ControlFactory * pFactory = m_pBeOSApp->getControlFactory(); UT_ASSERT(pFactory); UT_uint32 nrLabelItemsInLayout = m_pToolbarLayout->getLayoutItemCount(); UT_ASSERT(nrLabelItemsInLayout > 0); // Allow the user to control if we show text or icons or both ... #if 0 const XML_Char * szValue = NULL; m_pBeOSApp->getPrefsValue(XAP_PREF_KEY_ToolbarAppearance,&szValue); UT_ASSERT((szValue) && (*szValue)); GtkToolbarStyle style = GTK_TOOLBAR_ICONS; if (UT_XML_stricmp(szValue,"icon")==0) style = GTK_TOOLBAR_ICONS; else if (UT_XML_stricmp(szValue,"text")==0) style = GTK_TOOLBAR_TEXT; else if (UT_XML_stricmp(szValue,"both")==0) style = GTK_TOOLBAR_BOTH; #endif for (UT_uint32 k=0; (k < nrLabelItemsInLayout); k++) { EV_Toolbar_LayoutItem * pLayoutItem = m_pToolbarLayout->getLayoutItem(k); UT_ASSERT(pLayoutItem); XAP_Toolbar_Id id = pLayoutItem->getToolbarId(); EV_Toolbar_Action * pAction = pToolbarActionSet->getAction(id); UT_ASSERT(pAction); EV_Toolbar_Label * pLabel = m_pToolbarLabelSet->getLabel(id); UT_ASSERT(pLabel); switch (pLayoutItem->getToolbarLayoutFlags()) { case EV_TLF_Normal: { const char * szToolTip = pLabel->getToolTip(); if (!szToolTip || !*szToolTip) szToolTip = pLabel->getStatusMsg(); switch (pAction->getItemType()) { case EV_TBIT_ColorFore: case EV_TBIT_ColorBack: { UT_ASSERT(UT_stricmp(pLabel->getIconName(),"NoIcon")!=0); BBitmap * bitmap = m_pBeOSToolbarIcons->GetIconBitmap(pLabel->getIconName()); tb->AddItem(bitmap, NULL, id, szToolTip); } break; case EV_TBIT_PushButton: { DPRINTF(printf("EVTOOLBAR: Push button \n")); UT_ASSERT(UT_stricmp(pLabel->getIconName(),"NoIcon")!=0); BBitmap * bitmap = m_pBeOSToolbarIcons->GetIconBitmap(pLabel->getIconName()); //UT_ASSERT(bitmap); //Add the bitmap to the toolbar tb->AddItem(bitmap, NULL, id , szToolTip); } break; case EV_TBIT_GroupButton: DPRINTF(printf("EVTOOLBAR: Group Button \n")); case EV_TBIT_ToggleButton: { DPRINTF(printf("EVTOOLBAR: Toggle button \n")); UT_ASSERT(UT_stricmp(pLabel->getIconName(),"NoIcon")!=0); BBitmap * bitmap = m_pBeOSToolbarIcons->GetIconBitmap(pLabel->getIconName()); //UT_ASSERT(bitmap); //Add the bitmap to the toolbar tb->AddItem(bitmap, NULL, id , szToolTip); } break; case EV_TBIT_ComboBox: { DPRINTF(printf("EVTOOLBAR: Combo Box \n")); EV_Toolbar_Control * pControl = pFactory->getControl(this, id); UT_ASSERT(pControl); //Add a combo type box ... BPopUpMenu *popupmenu = new BPopUpMenu(""); UT_ASSERT(popupmenu); // populate it int iWidth = 100; if (pControl) { iWidth = pControl->getPixelWidth(); pControl->populate(); const UT_GenericVector<const char*> * v = pControl->getContents(); UT_ASSERT(v); if (v) { UT_uint32 items = v->getItemCount(); for (UT_uint32 m=0; m < items; m++) { char * sz = (char *)v->getNthItem(m); BMessage *togo = new BMessage('ddwn'); togo->AddInt32("id", id); togo->AddInt32("item", m); BMenuItem *newmenu = new BMenuItem(sz, togo); UT_ASSERT(newmenu); newmenu->SetTarget(tb); popupmenu->AddItem(newmenu); } } } //Stick it in the menu tb->AddItem(popupmenu, iWidth, id); } break; case EV_TBIT_EditText: case EV_TBIT_DropDown: case EV_TBIT_StaticLabel: case EV_TBIT_Spacer: break; case EV_TBIT_BOGUS: default: UT_ASSERT(0); break; } } break; case EV_TLF_Spacer: { tb->AddSeperator(); break; } default: UT_ASSERT(0); } } return true; }
//This is used to make the toolbar reflect the current state of //the document (enable, disable, set font values etc bool EV_BeOSToolbar::refreshToolbar(AV_View * pView, AV_ChangeMask mask) { const EV_Toolbar_ActionSet * pToolbarActionSet; pToolbarActionSet = m_pBeOSApp->getToolbarActionSet(); UT_ASSERT(pToolbarActionSet); int oldstate, perform_update = 0; UT_uint32 nrLabelItemsInLayout = m_pToolbarLayout->getLayoutItemCount(); for (UT_uint32 k=0; (k < nrLabelItemsInLayout); k++) { EV_Toolbar_LayoutItem * pLayoutItem = m_pToolbarLayout->getLayoutItem(k); UT_ASSERT(pLayoutItem); XAP_Toolbar_Id id = pLayoutItem->getToolbarId(); EV_Toolbar_Action * pAction = pToolbarActionSet->getAction(id); UT_ASSERT(pAction); AV_ChangeMask maskOfInterest = pAction->getChangeMaskOfInterest(); if ((maskOfInterest & mask) == 0) //If this item doesn't care about continue; // changes of this type, skip it... switch (pLayoutItem->getToolbarLayoutFlags()) { case EV_TLF_Normal: { const char * szState = 0; EV_Toolbar_ItemState tis = pAction->getToolbarItemState(pView,&szState); switch (pAction->getItemType()) { case EV_TBIT_ColorFore: case EV_TBIT_ColorBack: case EV_TBIT_PushButton: { bool bGrayed = EV_TIS_ShouldBeGray(tis); // UT_DEBUGMSG(("refreshToolbar: PushButton [%s] is %s\n", // m_pToolbarLabelSet->getLabel(id)->getToolbarLabel(), // ((bGrayed) ? "disabled" : "enabled"))); tb_item_t * item = m_pTBView->FindItemByID(id); if (item) { oldstate = item->state; item->state = (bGrayed) ? 0 : ENABLED_MASK; perform_update |= (oldstate == item->state) ? 0 : 1; if(perform_update) { m_pTBView->LockLooper(); m_pTBView->Invalidate(item->rect); m_pTBView->UnlockLooper(); } } } break; case EV_TBIT_GroupButton: // DPRINTF(printf("Ref Group->Toggle Button \n")); case EV_TBIT_ToggleButton: { bool bGrayed = EV_TIS_ShouldBeGray(tis); bool bToggled = EV_TIS_ShouldBeToggled(tis); // UT_DEBUGMSG(("refreshToolbar: ToggleBut [%s] is %s and %s\n", // m_pToolbarLabelSet->getLabel(id)->getToolbarLabel(), // ((bGrayed) ? "disabled" : "enabled"), // ((bToggled) ? "pressed" : "not pressed"))); tb_item_t * item = m_pTBView->FindItemByID(id); if (item) { oldstate = item->state; item->state = ((bGrayed) ? 0 : ENABLED_MASK) | ((bToggled) ? PRESSED_MASK : 0); perform_update |= (oldstate == item->state) ? 0 : 1; if(perform_update) { m_pTBView->LockLooper(); m_pTBView->Invalidate(item->rect); m_pTBView->UnlockLooper(); } } } break; case EV_TBIT_ComboBox: { // bool bGrayed = EV_TIS_ShouldBeGray(tis); bool bString = EV_TIS_ShouldUseString(tis); // UT_DEBUGMSG(("refreshToolbar: ComboBox [%s] is %s \n", // m_pToolbarLabelSet->getLabel(id)->getToolbarLabel(), // ((bString) ? szState : "no state"))); tb_item_t * item = m_pTBView->FindItemByID(id); if (item && bString) { BPopUpMenu *popup; UT_ASSERT(item->menu); popup = (BPopUpMenu*)item->menu->Menu(); UT_ASSERT(popup); BMenuItem *mnuitem = popup->FindItem(szState); if (mnuitem) { // printf("Can't find menu item %s \n", szState); // if (!(mnuitem = popup->FindItem("Dutch801 Rm BT"))) // break; //Send a message to fix that /* char *buffer = "Dutch801 Rm BT"; toolbarEvent(id, (UT_UCSChar *)buffer, strlen(buffer)); */ mnuitem->SetMarked(true); } } } break; case EV_TBIT_EditText: case EV_TBIT_DropDown: case EV_TBIT_StaticLabel: case EV_TBIT_Spacer: DPRINTF(printf("refreshToolbar: Update Text, DropDown, Label, Spacer \n")); break; case EV_TBIT_BOGUS: default: //KNORR!! //UT_ASSERT(0); break; } } break; case EV_TLF_Spacer: break; default: //KNORR!! //UT_ASSERT(0); break; } } #if 1 //TF I can't remember why I put this in, but it doesn't //seem to be needed now and is contributing in a big way //to the slowdown of the drag updates. //TF Note ... without this we don't get updated properly //when a button state changes. Instead put in hooks //that only update us as required. #endif return true; }