Refactor UX
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 12 Jun 2023 07:55:27 +0000 (09:55 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 12 Jun 2023 07:55:27 +0000 (09:55 +0200)
50 files changed:
org.argeo.app.core/OSGI-INF/l10n/bundle.properties [new file with mode: 0644]
org.argeo.app.core/OSGI-INF/l10n/bundle_de.properties [new file with mode: 0644]
org.argeo.app.core/OSGI-INF/l10n/bundle_fr.properties [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/AbstractArgeoApp.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/SuiteIcon.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/SuiteMsg.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/SuiteStyle.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/SuiteUxEvent.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultEditionLayer.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppLayer.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppUi.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/adminLeadPane.xml
swt/org.argeo.app.ui/OSGI-INF/cmsApp.xml
swt/org.argeo.app.ui/OSGI-INF/contentLayer.xml
swt/org.argeo.app.ui/OSGI-INF/dashboardLayer.xml
swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties
swt/org.argeo.app.ui/OSGI-INF/l10n/bundle_de.properties [deleted file]
swt/org.argeo.app.ui/OSGI-INF/l10n/bundle_fr.properties [deleted file]
swt/org.argeo.app.ui/OSGI-INF/leadPane.xml
swt/org.argeo.app.ui/OSGI-INF/mapLayer.xml
swt/org.argeo.app.ui/OSGI-INF/peopleLayer.xml
swt/org.argeo.app.ui/OSGI-INF/termsLayer.xml
swt/org.argeo.app.ui/OSGI-INF/wwwLayer.xml
swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultEditionLayer.java [deleted file]
swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultHeader.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLeadPane.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/RecentItems.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteIcon.java [deleted file]
swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteLayer.java [deleted file]
swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteMsg.java [deleted file]
swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteStyle.java [deleted file]
swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUi.java [deleted file]
swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUiUtils.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUxEvent.java [deleted file]
swt/org.argeo.app.ui/src/org/argeo/app/ui/dialogs/NewPersonPage.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/dialogs/NewPersonWizard.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsFolderUiProvider.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsTreeUiProvider.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/JcrContentEntryArea.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OpenLayersMap.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/GroupUiProvider.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/HierarchyUnitPart.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewOrgForm.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewUserForm.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PeopleEntryArea.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/UserColumn.java

diff --git a/org.argeo.app.core/OSGI-INF/l10n/bundle.properties b/org.argeo.app.core/OSGI-INF/l10n/bundle.properties
new file mode 100644 (file)
index 0000000..d4bf08a
--- /dev/null
@@ -0,0 +1,123 @@
+dashboard=dashboard
+#people=contacts
+documents=documents
+locations=locations
+recentItems=recent items
+
+appTitle=Argeo Suite
+
+#
+# PEOPLE
+# org.argeo.people.ui.PeopleMsg
+#
+person=person
+user=user
+org=organisation
+group=group
+
+# NewPersonWizard
+firstName=First Name
+lastName=Last Name
+salutation=Salutation
+email=Email
+personWizardWindowTitle=New person
+personWizardPageTitle=Create a contact
+personWizardFeedback=Contact was created
+
+# NewOrgWizard
+legalName=Legal name
+legalForm=Legal form
+vatId=VAT ID
+orgWizardWindowTitle=New organisation
+orgWizardPageTitle=Create an organisation
+orgWizardFeedback=Organisation was created
+
+# Roles
+userAdminRole=Can create users and modify them
+groupAdminRole=Can create groups and organisations and modify them
+publisherRole=Can validate and publish content
+coworkerRole=Is an active user of the organisation
+
+# Group
+chooseAMember=Choose a member
+
+# ContextAddressComposite
+chooseAnOrganisation=Choose an organisation
+street=Street
+streetComplement=Street complement
+zipCode=Zip code
+city=City
+state=State
+country=Country
+geopoint=Geopoint
+
+# FilteredOrderableEntityTable
+filterHelp=Type filter criterion separated by a space
+
+# BankAccountComposite
+accountHolder=Account holder
+bankName=Bank name
+currency=Currency
+accountNumber=Account number
+bankNumber=Bank number
+BIC=BIC
+IBAN=IBAN
+
+# EditJobDialog
+position=Role
+chosenItem=Chose item
+department=Department
+isPrimary=Is primary
+searchAndChooseEntity=Search and choose a corresponding entity
+
+# ContactListCTab (e4)
+notes=Notes
+addAContact=Add a contact
+contactValue=Contact value
+linkedCompany=Linked company
+
+# OrgAdminInfoCTab (e4)
+paymentAccount=Payment account
+
+# OrgEditor (e4)
+orgDetails=Details
+orgActivityLog=Activity log
+team=Team
+orgAdmin=Admin.
+
+# PersonEditor (e4)
+personDetails=Contact details
+personActivityLog=Activity log
+personOrgs=Organisations
+personSecurity=Security
+
+# PersonSecurityCTab (e4)
+resetPassword=Reset password
+
+# Generic
+label=Label
+aCustomLabel=A custom label
+description=Description
+value=Value
+name=Name
+primary=Primary
+add=Add
+save=Save
+pickUp=Pick up
+
+# Tags
+confirmNewTag=Tag #{0} is not yet registered. Are you sure you want to create it?
+cannotCreateTag=Tag #{0} is not yet registered and you don't have enough rights to create it.
+
+# People
+people=people
+
+# Library
+content=content
+
+# Geo
+map=map
+
+# Feedback messages
+allFieldsMustBeSet=All fields must be set
+
diff --git a/org.argeo.app.core/OSGI-INF/l10n/bundle_de.properties b/org.argeo.app.core/OSGI-INF/l10n/bundle_de.properties
new file mode 100644 (file)
index 0000000..0af19c2
--- /dev/null
@@ -0,0 +1,98 @@
+dashboard=dashboard
+people=Kontakte
+documents=Dokumente
+locations=Orte
+recentItems=neulich
+
+appTitle=Argeo Suite
+
+#
+# PEOPLE
+# org.argeo.people.ui.PeopleMsg
+#
+person=Person
+organisation=Organisation
+
+# NewPersonWizard
+firstName=Vorname
+lastName=Nachname
+salutation=Salutation
+email=E-Mail
+personWizardWindowTitle=Neue Person
+personWizardPageTitle=Kontakt erstellen
+
+# NewOrgWizard
+legalName=Name
+legalForm=Geschäftsform
+vatId=Ust ID
+orgWizardWindowTitle=Neue Organisation
+orgWizardPageTitle=Organisation erstellen
+
+
+# ContextAddressComposite
+chooseAnOrganisation=Organisation wählen
+street=Strasse
+streetComplement=Strasse Zusatz
+zipCode=PLZ
+city=Stadt
+state=Bundesland
+country=Land
+geopoint=Geopoint
+
+# FilteredOrderableEntityTable
+filterHelp=Type filter criterion separated by a space
+
+# BankAccountComposite
+accountHolder=Kontoinhaber 
+bankName=Name der Bank
+currency=Währung
+accountNumber=Kontonummer
+bankNumber=BLZ
+BIC=BIC
+IBAN=IBAN
+
+# EditJobDialog
+position=Rolle
+chosenItem=Auswahl
+department=Abteilung
+isPrimary=Ist Primär
+searchAndChooseEntity=Suche und wähle ein zugehöriges Objekt
+
+# ContactListCTab (e4)
+notes=Bemerkungen
+addAContact=Kontakt hinzufügen
+contactValue=Kontakt value
+linkedCompany=zugehörige Firma
+
+# OrgAdminInfoCTab (e4)
+paymentAccount=Geschäftskonto
+
+# OrgEditor (e4)
+orgDetails=Details
+orgActivityLog=Aktivitäten Log
+team=Team
+orgAdmin=Admin.
+
+# PersonEditor (e4)
+personDetails=Kontakt Daten
+personActivityLog=Aktivitäten Log
+personOrgs=Organisationen
+personSecurity=Sicherheit
+
+# PersonSecurityCTab (e4)
+resetPassword=Passwort zurücksetzen
+
+# Generic
+label=Beschriftung
+aCustomLabel=Eine spezifische Beschriftung
+description=Beschreibung
+value=Wert
+name=Name
+primary=Haupt-
+add=Hinzufügen
+save=Speichern
+pickUp=Aussuchen
+
+# Tags
+confirmNewTag=Das Hashtag '{0}' existiert noch nicht. WollenSie es hinzufügen?
+cannotCreateTag=Das Hashtag '{0}' existiert nicht uns Sie haben nicht die Rechte, um es hinzufügen.
diff --git a/org.argeo.app.core/OSGI-INF/l10n/bundle_fr.properties b/org.argeo.app.core/OSGI-INF/l10n/bundle_fr.properties
new file mode 100644 (file)
index 0000000..0015269
--- /dev/null
@@ -0,0 +1,117 @@
+dashboard=dashboard
+people=contacts
+documents=documents
+locations=lieux
+recentItems=récent
+
+appTitle=Argeo Suite
+
+#
+# GENERIC
+#
+
+#
+# PEOPLE
+# org.argeo.people.ui.PeopleMsg
+#
+person=personne
+user=utilisateur
+org=organisation
+group=groupe
+
+# NewPersonWizard
+firstName=Prénom
+lastName=Nom
+salutation=Salutation
+email=Email
+personWizardWindowTitle=Nouvelle personne
+personWizardPageTitle=Créer un contact
+personWizardFeedback=Le contact a été créé
+
+# NewOrgWizard
+legalName=Nom
+legalForm=Forme légale
+vatId=ID TVA
+orgWizardWindowTitle=Nouvelle organisation
+orgWizardPageTitle=Créer une organisation
+orgWizardFeedback=L'organisation a été crée
+
+# Roles
+userAdminRole=Peut créer des utilisateurs et les modifier
+groupAdminRole=Peut créer des groupes et des organisations et les modifier
+publisherRole=Peut publier et valider du contenu
+coworkerRole=Est un membre en activité de l'organisation
+
+# Group
+chooseAMember=Choisir un membre
+
+# ContextAddressComposite
+chooseAnOrganisation=Choisir une organisation
+street=Rue
+streetComplement=Complément rue
+zipCode=Code postal
+city=Ville
+state=État
+country=Pays
+geopoint=Géocoordonnées
+
+# FilteredOrderableEntityTable
+filterHelp=Sasir les critères de filtrage séparés par des espaces 
+
+# BankAccountComposite
+accountHolder=Propriétaire du compte
+bankName=Nom de la banque
+currency=Devise
+accountNumber=Numéro de compte
+bankNumber=Numéro de banque
+BIC=BIC
+IBAN=IBAN
+
+# EditJobDialog
+position=Rôle
+chosenItem=Choisir une élément
+department=Service
+isPrimary=Principal
+searchAndChooseEntity=Cherhcer et choisir l'entitée correspondante
+
+# ContactListCTab (e4)
+notes=Notes
+addAContact=Ajouter un contact
+contactValue=Valeur
+linkedCompany=Entreprise liée
+
+# OrgAdminInfoCTab (e4)
+paymentAccount=Compte de paiement
+
+# OrgEditor (e4)
+orgDetails=Détails
+orgActivityLog=Activités
+team=Équipe
+orgAdmin=Admin.
+
+# PersonEditor (e4)
+personDetails=Détails du contact
+personActivityLog=Activités
+personOrgs=Organisations
+personSecurity=Accès
+
+# PersonSecurityCTab (e4)
+resetPassword=Force le mot de passe
+
+# Generic
+label=Étiquette
+aCustomLabel=Une étiquette spécifique
+description=Description
+value=Valeur
+name=Nom
+primary=Principal
+add=Ajouter
+save=Sauver
+pickUp=Choisir
+
+# Tags
+confirmNewTag=Le tag #{0} n'existe pas encore. Voulez-vous le créer?
+cannotCreateTag=Le tag #{0} n'existe pas encore et vous n'avez pas les droits pour le créer.
+
+# Feedback messages
+allFieldsMustBeSet=Toutes les données doivent être renseignées
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/AbstractArgeoApp.java b/org.argeo.app.core/src/org/argeo/app/ux/AbstractArgeoApp.java
new file mode 100644 (file)
index 0000000..2bb9c6a
--- /dev/null
@@ -0,0 +1,7 @@
+package org.argeo.app.ux;
+
+import org.argeo.cms.AbstractCmsApp;
+
+public abstract class AbstractArgeoApp extends AbstractCmsApp {
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/SuiteIcon.java b/org.argeo.app.core/src/org/argeo/app/ux/SuiteIcon.java
new file mode 100644 (file)
index 0000000..7ae9360
--- /dev/null
@@ -0,0 +1,22 @@
+package org.argeo.app.ux;
+
+import org.argeo.api.cms.ux.CmsIcon;
+
+/** Icon names used by Argeo Suite. */
+public enum SuiteIcon implements CmsIcon {
+       add, save, close, closeAll, search, delete, logout, dashboard,
+       // people
+       people, group, person, organisation, addressBook, users, organisationContact,
+       // library
+       documents, document, folder,
+       // management
+       report,
+       // admin and settings
+       settings, user,
+       // misc
+       task, tag, location, inbox, map, todo,
+       // actions
+       openUserMenu,
+       //
+       ;
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/SuiteMsg.java b/org.argeo.app.core/src/org/argeo/app/ux/SuiteMsg.java
new file mode 100644 (file)
index 0000000..d244bd3
--- /dev/null
@@ -0,0 +1,45 @@
+package org.argeo.app.ux;
+
+import org.argeo.cms.Localized;
+
+/** Localized messages. */
+public enum SuiteMsg implements Localized {
+       // Entities
+       user, org, person, group,
+       // UI parts
+       dashboard, people, documents, locations, recentItems,
+       // NewPersonWizard
+       firstName, lastName, salutation, email, personWizardWindowTitle, personWizardPageTitle, personWizardFeedback,
+       // NewOrgWizard
+       orgWizardWindowTitle, orgWizardPageTitle, orgWizardFeedback, legalName, legalForm, vatId,
+       // Roles
+       userAdminRole, groupAdminRole, publisherRole, coworkerRole,
+       // Group
+       chooseAMember,
+       // ContextAddressComposite
+       chooseAnOrganisation, street, streetComplement, zipCode, city, state, country, geopoint,
+       // FilteredOrderableEntityTable
+       filterHelp,
+       // BankAccountComposite
+       accountHolder, bankName, currency, accountNumber, bankNumber, BIC, IBAN,
+       // EditJobDialog
+       position, chosenItem, department, isPrimary, searchAndChooseEntity,
+       // ContactListCTab (e4)
+       notes, addAContact, contactValue, linkedCompany,
+       // OrgAdminInfoCTab (e4)
+       paymentAccount,
+       // OrgEditor (e4)
+       orgDetails, orgActivityLog, team, orgAdmin,
+       // PersonEditor (e4)
+       personDetails, personActivityLog, personOrgs, personSecurity,
+       // PersonSecurityCTab (e4)
+       resetPassword,
+       // Generic
+       label, aCustomLabel, description, value, name, primary, add, save, pickup,
+       // Tag
+       confirmNewTag, cannotCreateTag,
+       // Feedback messages
+       allFieldsMustBeSet,
+       //
+       ;
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/SuiteStyle.java b/org.argeo.app.core/src/org/argeo/app/ux/SuiteStyle.java
new file mode 100644 (file)
index 0000000..a115210
--- /dev/null
@@ -0,0 +1,35 @@
+package org.argeo.app.ux;
+
+import org.argeo.api.cms.ux.CmsStyle;
+
+/** Styles used by Argeo Suite work UI. */
+public enum SuiteStyle implements CmsStyle {
+       // header
+       header, headerTitle, headerMenu, headerMenuItem,
+       // footer
+       footer,
+       // recent items
+       recentItems,
+       // lead pane
+       leadPane, leadPaneItem, leadPaneSectionTitle, leadPaneSubSectionTitle,
+       // entry area
+       entryArea,
+       // group composite
+       titleContainer, titleLabel, subTitleLabel, formLine, formColumn, navigationBar, navigationTitle, navigationButton,
+       // forms elements
+       simpleLabel, simpleText, simpleInput,
+       // table
+       titleCell,
+       // layers
+       workArea,
+       // tabbed area
+       mainTabBody, mainTabSelected, mainTab,
+       // buttons
+       inlineButton;
+
+       @Override
+       public String getClassPrefix() {
+               return "argeo-suite";
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/SuiteUxEvent.java b/org.argeo.app.core/src/org/argeo/app/ux/SuiteUxEvent.java
new file mode 100644 (file)
index 0000000..4d690fd
--- /dev/null
@@ -0,0 +1,34 @@
+package org.argeo.app.ux;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.CmsEvent;
+
+/** Events specific to Argeo Suite UX. */
+public enum SuiteUxEvent implements CmsEvent {
+       openNewPart, refreshPart, switchLayer;
+
+       public final static String LAYER = "layer";
+       public final static String USERNAME = "username";
+
+       // ACR
+       public final static String CONTENT_PATH = "contentPath";
+
+       public String getTopicBase() {
+               return "argeo.suite.ui";
+       }
+
+       public static Map<String, Object> eventProperties(Content content) {
+               Map<String, Object> properties = new HashMap<>();
+               properties.put(CONTENT_PATH, content.getPath());
+               return properties;
+       }
+
+//     public static Map<String, Object> eventProperties(User user) {
+//             Map<String, Object> properties = new HashMap<>();
+//             properties.put(USERNAME, user.getName());
+//             return properties;
+//     }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultEditionLayer.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultEditionLayer.java
new file mode 100644 (file)
index 0000000..fd5dca7
--- /dev/null
@@ -0,0 +1,317 @@
+package org.argeo.app.swt.ux;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.argeo.api.acr.Content;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteStyle;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtTabbedArea;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.util.LangUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.wiring.BundleWiring;
+
+/** An app layer based on an entry area and an editor area. */
+public class DefaultEditionLayer implements SwtAppLayer {
+       private String id;
+       private SwtUiProvider entryArea;
+       private SwtUiProvider defaultView;
+       private SwtUiProvider workArea;
+       private List<String> weights = new ArrayList<>();
+       private boolean startMaximized = false;
+       private boolean fixedEntryArea = false;
+       private boolean singleTab = false;
+       private Localized title = null;
+       private Localized singleTabTitle = null;
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               // TODO Factorize more, or split into more specialised classes?
+               if (entryArea != null) {
+                       if (fixedEntryArea) {
+                               FixedEditionArea editionArea = new FixedEditionArea(parent, parent.getStyle());
+                               Control entryAreaC = entryArea.createUiPart(editionArea.getEntryArea(), context);
+                               CmsSwtUtils.style(entryAreaC, SuiteStyle.entryArea);
+                               if (this.defaultView != null) {
+                                       editionArea.getTabbedArea().view(defaultView, context);
+                               }
+                               return editionArea;
+                       } else {
+                               SashFormEditionArea editionArea = new SashFormEditionArea(parent, parent.getStyle());
+                               entryArea.createUiPart(editionArea.getEntryArea(), context);
+                               if (this.defaultView != null) {
+                                       editionArea.getTabbedArea().view(defaultView, context);
+                               }
+                               return editionArea;
+                       }
+               } else {
+                       if (this.workArea != null) {
+                               Composite area = new Composite(parent, SWT.NONE);
+                               this.workArea.createUiPart(area, context);
+                               return area;
+                       }
+                       CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+                       SwtTabbedArea tabbedArea = createTabbedArea(parent, theme);
+                       return tabbedArea;
+               }
+       }
+
+       @Override
+       public void view(SwtUiProvider uiProvider, Composite workAreaC, Content context) {
+               if (workArea != null) {
+                       CmsSwtUtils.clear(workAreaC);
+                       workArea.createUiPart(workAreaC, context);
+                       workAreaC.layout(true, true);
+                       return;
+               }
+
+               // tabbed area
+               SwtTabbedArea tabbedArea = findTabbedArea(workAreaC);
+               if (tabbedArea == null)
+                       throw new IllegalArgumentException("Unsupported work area " + workAreaC.getClass().getName());
+               if (uiProvider == null) {
+                       // reset
+                       tabbedArea.closeAllTabs();
+                       if (this.defaultView != null) {
+                               tabbedArea.view(defaultView, context);
+                       }
+               } else {
+                       tabbedArea.view(uiProvider, context);
+               }
+       }
+
+       @Override
+       public Content getCurrentContext(Composite workArea) {
+               SwtTabbedArea tabbedArea = findTabbedArea(workArea);
+               if (tabbedArea == null)
+                       return null;
+               return tabbedArea.getCurrentContext();
+       }
+
+       private SwtTabbedArea findTabbedArea(Composite workArea) {
+               SwtTabbedArea tabbedArea = null;
+               if (workArea instanceof SashFormEditionArea) {
+                       tabbedArea = ((SashFormEditionArea) workArea).getTabbedArea();
+               } else if (workArea instanceof FixedEditionArea) {
+                       tabbedArea = ((FixedEditionArea) workArea).getTabbedArea();
+               } else if (workArea instanceof SwtTabbedArea) {
+                       tabbedArea = (SwtTabbedArea) workArea;
+               }
+               return tabbedArea;
+       }
+
+       @Override
+       public void open(SwtUiProvider uiProvider, Composite workArea, Content context) {
+               SwtTabbedArea tabbedArea = ((SashFormEditionArea) workArea).getTabbedArea();
+               tabbedArea.open(uiProvider, context);
+       }
+
+       @Override
+       public Localized getTitle() {
+               return title;
+       }
+
+       @Override
+       public String getId() {
+               return id;
+       }
+
+       public void init(BundleContext bundleContext, Map<String, Object> properties) {
+               String pid = (String) properties.get(Constants.SERVICE_PID);
+               id = pid;
+
+               weights = LangUtils.toStringList(properties.get(Property.weights.name()));
+               startMaximized = properties.containsKey(Property.startMaximized.name())
+                               && "true".equals(properties.get(Property.startMaximized.name()));
+               fixedEntryArea = properties.containsKey(Property.fixedEntryArea.name())
+                               && "true".equals(properties.get(Property.fixedEntryArea.name()));
+               if (fixedEntryArea && weights.size() != 0) {
+                       throw new IllegalArgumentException("Property " + Property.weights.name() + " should not be set if property "
+                                       + Property.fixedEntryArea.name() + " is set.");
+               }
+               singleTab = properties.containsKey(Property.singleTab.name())
+                               && "true".equals(properties.get(Property.singleTab.name()));
+
+               String titleStr = (String) properties.get(SwtAppLayer.Property.title.name());
+               if (titleStr != null) {
+                       if (titleStr.startsWith("%")) {
+                               title = new Localized() {
+
+                                       @Override
+                                       public String name() {
+                                               return titleStr;
+                                       }
+
+                                       @Override
+                                       public ClassLoader getL10nClassLoader() {
+                                               return bundleContext != null
+                                                               ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
+                                                               : getClass().getClassLoader();
+                                       }
+                               };
+                       } else {
+                               title = new Localized.Untranslated(titleStr);
+                       }
+               }
+
+               String singleTabTitleStr = (String) properties.get(SwtAppLayer.Property.singleTabTitle.name());
+               if (singleTabTitleStr != null) {
+                       if (singleTabTitleStr.startsWith("%")) {
+                               singleTabTitle = new Localized() {
+
+                                       @Override
+                                       public String name() {
+                                               return singleTabTitleStr;
+                                       }
+
+                                       @Override
+                                       public ClassLoader getL10nClassLoader() {
+                                               return bundleContext != null
+                                                               ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
+                                                               : getClass().getClassLoader();
+                                       }
+                               };
+                       } else {
+                               singleTabTitle = new Localized.Untranslated(singleTabTitleStr);
+                       }
+               }
+
+       }
+
+       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
+
+       }
+
+       public void setEntryArea(SwtUiProvider entryArea) {
+               this.entryArea = entryArea;
+       }
+
+       public void setWorkArea(SwtUiProvider workArea) {
+               this.workArea = workArea;
+       }
+
+       public void setDefaultView(SwtUiProvider defaultView) {
+               this.defaultView = defaultView;
+       }
+
+       SwtTabbedArea createTabbedArea(Composite parent, CmsSwtTheme theme) {
+               SwtTabbedArea tabbedArea = new SwtTabbedArea(parent, SWT.NONE);
+               tabbedArea.setSingleTab(singleTab);
+               if (singleTabTitle != null)
+                       tabbedArea.setSingleTabTitle(singleTabTitle.lead());
+               tabbedArea.setBodyStyle(SuiteStyle.mainTabBody.style());
+               tabbedArea.setTabStyle(SuiteStyle.mainTab.style());
+               tabbedArea.setTabSelectedStyle(SuiteStyle.mainTabSelected.style());
+               tabbedArea.setCloseIcon(theme.getSmallIcon(SuiteIcon.close));
+               tabbedArea.setLayoutData(CmsSwtUtils.fillAll());
+               return tabbedArea;
+       }
+
+//     /** A work area based on an entry area and and a tabbed area. */
+       class SashFormEditionArea extends SashForm {
+               private static final long serialVersionUID = 2219125778722702618L;
+               private SwtTabbedArea tabbedArea;
+               private Composite entryC;
+
+               SashFormEditionArea(Composite parent, int style) {
+                       super(parent, SWT.HORIZONTAL);
+                       CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+
+                       Composite editorC;
+                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
+                               editorC = new Composite(this, SWT.BORDER);
+                               entryC = new Composite(this, SWT.BORDER);
+                       } else {
+                               entryC = new Composite(this, SWT.NONE);
+                               editorC = new Composite(this, SWT.NONE);
+                       }
+
+                       // sash form specific
+                       if (weights.size() != 0) {
+                               int[] actualWeight = new int[weights.size()];
+                               for (int i = 0; i < weights.size(); i++) {
+                                       actualWeight[i] = Integer.parseInt(weights.get(i));
+                               }
+                               setWeights(actualWeight);
+                       } else {
+                               int[] actualWeights = new int[] { 3000, 7000 };
+                               setWeights(actualWeights);
+                       }
+                       if (startMaximized)
+                               setMaximizedControl(editorC);
+
+                       GridLayout editorAreaLayout = CmsSwtUtils.noSpaceGridLayout();
+//                     editorAreaLayout.verticalSpacing = 0;
+//                     editorAreaLayout.marginBottom = 0;
+//                     editorAreaLayout.marginHeight = 0;
+//                     editorAreaLayout.marginLeft = 0;
+//                     editorAreaLayout.marginRight = 0;
+                       editorC.setLayout(editorAreaLayout);
+
+                       tabbedArea = createTabbedArea(editorC, theme);
+               }
+
+               SwtTabbedArea getTabbedArea() {
+                       return tabbedArea;
+               }
+
+               Composite getEntryArea() {
+                       return entryC;
+               }
+
+       }
+
+       class FixedEditionArea extends Composite {
+               private static final long serialVersionUID = -5525672639277322465L;
+               private SwtTabbedArea tabbedArea;
+               private Composite entryC;
+
+               public FixedEditionArea(Composite parent, int style) {
+                       super(parent, style);
+                       CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+
+                       setLayout(CmsSwtUtils.noSpaceGridLayout(2));
+
+                       Composite editorC;
+                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
+                               editorC = new Composite(this, SWT.NONE);
+                               entryC = new Composite(this, SWT.NONE);
+                       } else {
+                               entryC = new Composite(this, SWT.NONE);
+                               editorC = new Composite(this, SWT.NONE);
+                       }
+                       entryC.setLayoutData(CmsSwtUtils.fillHeight());
+
+                       GridLayout editorAreaLayout = CmsSwtUtils.noSpaceGridLayout();
+//                     editorAreaLayout.verticalSpacing = 0;
+//                     editorAreaLayout.marginBottom = 0;
+//                     editorAreaLayout.marginHeight = 0;
+//                     editorAreaLayout.marginLeft = 0;
+//                     editorAreaLayout.marginRight = 0;
+                       editorC.setLayout(editorAreaLayout);
+                       editorC.setLayoutData(CmsSwtUtils.fillAll());
+
+                       tabbedArea = createTabbedArea(editorC, theme);
+               }
+
+               SwtTabbedArea getTabbedArea() {
+                       return tabbedArea;
+               }
+
+               Composite getEntryArea() {
+                       return entryC;
+               }
+       }
+
+}
\ No newline at end of file
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppLayer.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppLayer.java
new file mode 100644 (file)
index 0000000..e99d165
--- /dev/null
@@ -0,0 +1,27 @@
+package org.argeo.app.swt.ux;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.eclipse.swt.widgets.Composite;
+
+/** An UI layer for the main work area. */
+public interface SwtAppLayer extends SwtUiProvider {
+       static enum Property {
+               title, icon, weights, startMaximized, singleTab, singleTabTitle, fixedEntryArea;
+       }
+
+       String getId();
+
+       void view(SwtUiProvider uiProvider, Composite workArea, Content context);
+
+       Content getCurrentContext(Composite workArea);
+
+       default void open(SwtUiProvider uiProvider, Composite workArea, Content context) {
+               view(uiProvider, workArea, context);
+       }
+
+       default Localized getTitle() {
+               return null;
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppUi.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppUi.java
new file mode 100644 (file)
index 0000000..a604fc0
--- /dev/null
@@ -0,0 +1,224 @@
+package org.argeo.app.swt.ux;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.app.ux.SuiteStyle;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.CmsSwtUi;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/** The view for the default UX of Argeo Suite. */
+public class SwtAppUi extends CmsSwtUi {
+       private static final long serialVersionUID = 6207018859086689108L;
+       private final static CmsLog log = CmsLog.getLog(SwtAppUi.class);
+
+       private Localized title;
+       private Composite header;
+       private Composite footer;
+       private Composite belowHeader;
+       private Composite leadPane;
+       private Composite sidePane;
+       private Composite dynamicArea;
+
+       private Content userDir;
+
+       private Map<String, SwtAppLayer> layers = new HashMap<>();
+       private Map<String, Composite> workAreas = new HashMap<>();
+       private String currentLayerId = null;
+
+       private boolean loginScreen = false;
+
+       public SwtAppUi(Composite parent, int style) {
+               super(parent, style);
+               this.setLayout(CmsSwtUtils.noSpaceGridLayout());
+
+               header = new Composite(this, SWT.NONE);
+               header.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               CmsSwtUtils.style(header, SuiteStyle.header);
+               header.setLayoutData(CmsSwtUtils.fillWidth());
+
+               belowHeader = new Composite(this, SWT.NONE);
+               belowHeader.setLayoutData(CmsSwtUtils.fillAll());
+
+               footer = new Composite(this, SWT.NONE);
+               footer.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               CmsSwtUtils.style(footer, SuiteStyle.footer);
+               footer.setLayoutData(CmsSwtUtils.fillWidth());
+       }
+
+       public void refreshBelowHeader(boolean initApp) {
+               CmsSwtUtils.clear(belowHeader);
+               int style = getStyle();
+               if (initApp) {
+                       belowHeader.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
+
+                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
+                               sidePane = new Composite(belowHeader, SWT.NONE);
+                               sidePane.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                               sidePane.setLayoutData(CmsSwtUtils.fillHeight());
+                               dynamicArea = new Composite(belowHeader, SWT.NONE);
+                               leadPane = new Composite(belowHeader, SWT.NONE);
+                       } else {
+                               leadPane = new Composite(belowHeader, SWT.NONE);
+                               dynamicArea = new Composite(belowHeader, SWT.NONE);
+                               sidePane = new Composite(belowHeader, SWT.NONE);
+                               sidePane.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                               sidePane.setLayoutData(CmsSwtUtils.fillHeight());
+                       }
+                       leadPane.setLayoutData(CmsSwtUtils.fillHeight());
+                       leadPane.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                       CmsSwtUtils.style(leadPane, SuiteStyle.leadPane);
+
+                       dynamicArea.setLayoutData(CmsSwtUtils.fillAll());
+                       dynamicArea.setLayout(new FormLayout());
+
+               } else {
+                       belowHeader.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               }
+       }
+
+       /*
+        * LAYERS
+        */
+
+       public Composite getCurrentWorkArea() {
+               if (currentLayerId == null)
+                       throw new IllegalStateException("No current layer");
+               return workAreas.get(currentLayerId);
+       }
+
+       public String getCurrentLayerId() {
+               return currentLayerId;
+       }
+
+       private Composite getLayer(String id, Content context) {
+               if (!layers.containsKey(id))
+                       return null;
+               if (!workAreas.containsKey(id))
+                       initLayer(id, layers.get(id), context);
+               return workAreas.get(id);
+       }
+
+       public Composite switchToLayer(String layerId, Content context) {
+               Composite current = null;
+               if (currentLayerId != null) {
+                       current = getCurrentWorkArea();
+                       if (currentLayerId.equals(layerId))
+                               return current;
+               }
+               if (context == null) {
+                       if (!getCmsView().isAnonymous())
+                               context = getUserDir();
+               }
+               Composite toShow = getLayer(layerId, context);
+               if (toShow != null) {
+                       currentLayerId = layerId;
+                       if (!isDisposed()) {
+                               if (!toShow.isDisposed()) {
+                                       toShow.moveAbove(null);
+                               } else {
+                                       log.warn("Cannot show work area because it is disposed.");
+                                       toShow = initLayer(layerId, layers.get(layerId), context);
+                                       toShow.moveAbove(null);
+                               }
+                               dynamicArea.layout(true, true);
+                       }
+                       return toShow;
+               } else {
+                       return current;
+               }
+       }
+
+       public void switchToLayer(SwtAppLayer layer, Content context) {
+               // TODO make it more robust
+               for (String layerId : layers.keySet()) {
+                       SwtAppLayer l = layers.get(layerId);
+                       if (layer.getId().equals(l.getId())) {
+                               switchToLayer(layerId, context);
+                               return;
+                       }
+               }
+               throw new IllegalArgumentException("Layer is not registered.");
+       }
+
+       public void addLayer(String id, SwtAppLayer layer) {
+               layers.put(id, layer);
+       }
+
+       public void removeLayer(String id) {
+               layers.remove(id);
+               if (workAreas.containsKey(id)) {
+                       Composite workArea = workAreas.remove(id);
+                       if (!workArea.isDisposed())
+                               workArea.dispose();
+               }
+       }
+
+       protected Composite initLayer(String id, SwtAppLayer layer, Content context) {
+               Composite workArea = getCmsView().doAs(() -> (Composite) layer.createUiPart(dynamicArea, context));
+               CmsSwtUtils.style(workArea, SuiteStyle.workArea);
+               workArea.setLayoutData(CmsSwtUtils.coverAll());
+               workAreas.put(id, workArea);
+               return workArea;
+       }
+
+       public synchronized void logout() {
+               userDir = null;
+               currentLayerId = null;
+               workAreas.clear();
+       }
+
+       /*
+        * GETTERS / SETTERS
+        */
+
+       public Composite getHeader() {
+               return header;
+       }
+
+       public Composite getFooter() {
+               return footer;
+       }
+
+       public Composite getLeadPane() {
+               return leadPane;
+       }
+
+       public Composite getSidePane() {
+               return sidePane;
+       }
+
+       public Composite getBelowHeader() {
+               return belowHeader;
+       }
+
+       public Content getUserDir() {
+               return userDir;
+       }
+
+       public void setUserDir(Content userDir) {
+               this.userDir = userDir;
+       }
+
+       public Localized getTitle() {
+               return title;
+       }
+
+       public void setTitle(Localized title) {
+               this.title = title;
+       }
+
+       public boolean isLoginScreen() {
+               return loginScreen;
+       }
+
+       public void setLoginScreen(boolean loginScreen) {
+               this.loginScreen = loginScreen;
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java
new file mode 100644 (file)
index 0000000..733c0db
--- /dev/null
@@ -0,0 +1,34 @@
+package org.argeo.app.swt.ux;
+
+import java.util.Set;
+
+import org.argeo.api.cms.ux.CmsUi;
+import org.argeo.app.ux.AbstractArgeoApp;
+
+public class SwtArgeoApp extends AbstractArgeoApp {
+       @Override
+       public Set<String> getUiNames() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public CmsUi initUi(Object uiParent) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public void refreshUi(CmsUi cmsUi, String state) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public void setState(CmsUi cmsUi, String state) {
+               // TODO Auto-generated method stub
+
+       }
+
+
+}
index 8d69ead19963c6d6e70c099b9b3004b2d40623f4..306ad942ae5f91c9789188acb55cc1f1d49a1878 100644 (file)
@@ -8,5 +8,5 @@
    <property name="service.ranking" type="Integer" value="-1000"/>
    <property name="defaultLayers" type="String">argeo.suite.ui.termsLayer
    </property>
-   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.app.ui.SuiteLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
+   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.app.swt.ux.SwtAppLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
 </scr:component>
index f9de1dd38585f1f7855c75bc4e376299256d0649..a82f9af57c43f0b375dcee8ec50a66c7739487d1 100644 (file)
@@ -7,7 +7,7 @@
    <properties entry="config/cmsApp.properties"/>
    <reference bind="addUiProvider" cardinality="0..n" interface="org.argeo.cms.swt.acr.SwtUiProvider" policy="dynamic" unbind="removeUiProvider"/>
    <reference bind="addTheme" cardinality="1..n" interface="org.argeo.api.cms.ux.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
-   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.app.ui.SuiteLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
+   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.app.swt.ux.SwtAppLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
    <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.api.cms.directory.CmsUserManager" name="CmsUserManager" policy="static"/>
    <reference bind="setCmsContext" cardinality="1..1" interface="org.argeo.api.cms.CmsContext" name="CmsContext" policy="static"/>
    <reference bind="setContentRepository" cardinality="1..1" interface="org.argeo.api.acr.ContentRepository" name="ContentRepository" policy="static"/>
index 7e56e4790f1e8086884927ab09db48e9f972c315..9a550f4445b99e3bef238168167b7da742eab47e 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Content Layer">
-   <implementation class="org.argeo.app.ui.DefaultEditionLayer"/>
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
    <service>
-      <provide interface="org.argeo.app.ui.SuiteLayer"/>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
    </service>
    <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.swt.acr.SwtUiProvider" policy="dynamic" target="(service.pid=argeo.library.ui.contentEntryArea)"/>
    <property name="service.ranking" type="Integer" value="-1000"/>
index c8c6ac99ce8cbac057fc5531385877891e1aadbb..a62d6e57dc3ac48d72a20650a46e3312c4055c33 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Dashboard Layer">
-   <implementation class="org.argeo.app.ui.DefaultEditionLayer"/>
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
    <service>
-      <provide interface="org.argeo.app.ui.SuiteLayer"/>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
    </service>
    <property name="service.ranking" type="Integer" value="-1000"/>
    <properties entry="config/dashboardLayer.properties"/>
index d4bf08ada4aa90cfcb452176066f239f901393c7..8a9cc954e8a39407fafea10c12c80accad896675 100644 (file)
@@ -1,123 +1 @@
-dashboard=dashboard
-#people=contacts
-documents=documents
-locations=locations
-recentItems=recent items
-
-appTitle=Argeo Suite
-
-#
-# PEOPLE
-# org.argeo.people.ui.PeopleMsg
-#
-person=person
-user=user
-org=organisation
-group=group
-
-# NewPersonWizard
-firstName=First Name
-lastName=Last Name
-salutation=Salutation
-email=Email
-personWizardWindowTitle=New person
-personWizardPageTitle=Create a contact
-personWizardFeedback=Contact was created
-
-# NewOrgWizard
-legalName=Legal name
-legalForm=Legal form
-vatId=VAT ID
-orgWizardWindowTitle=New organisation
-orgWizardPageTitle=Create an organisation
-orgWizardFeedback=Organisation was created
-
-# Roles
-userAdminRole=Can create users and modify them
-groupAdminRole=Can create groups and organisations and modify them
-publisherRole=Can validate and publish content
-coworkerRole=Is an active user of the organisation
-
-# Group
-chooseAMember=Choose a member
-
-# ContextAddressComposite
-chooseAnOrganisation=Choose an organisation
-street=Street
-streetComplement=Street complement
-zipCode=Zip code
-city=City
-state=State
-country=Country
-geopoint=Geopoint
-
-# FilteredOrderableEntityTable
-filterHelp=Type filter criterion separated by a space
-
-# BankAccountComposite
-accountHolder=Account holder
-bankName=Bank name
-currency=Currency
-accountNumber=Account number
-bankNumber=Bank number
-BIC=BIC
-IBAN=IBAN
-
-# EditJobDialog
-position=Role
-chosenItem=Chose item
-department=Department
-isPrimary=Is primary
-searchAndChooseEntity=Search and choose a corresponding entity
-
-# ContactListCTab (e4)
-notes=Notes
-addAContact=Add a contact
-contactValue=Contact value
-linkedCompany=Linked company
-
-# OrgAdminInfoCTab (e4)
-paymentAccount=Payment account
-
-# OrgEditor (e4)
-orgDetails=Details
-orgActivityLog=Activity log
-team=Team
-orgAdmin=Admin.
-
-# PersonEditor (e4)
-personDetails=Contact details
-personActivityLog=Activity log
-personOrgs=Organisations
-personSecurity=Security
-
-# PersonSecurityCTab (e4)
-resetPassword=Reset password
-
-# Generic
-label=Label
-aCustomLabel=A custom label
-description=Description
-value=Value
-name=Name
-primary=Primary
-add=Add
-save=Save
-pickUp=Pick up
-
-# Tags
-confirmNewTag=Tag #{0} is not yet registered. Are you sure you want to create it?
-cannotCreateTag=Tag #{0} is not yet registered and you don't have enough rights to create it.
-
-# People
-people=people
-
-# Library
-content=content
-
-# Geo
-map=map
-
-# Feedback messages
-allFieldsMustBeSet=All fields must be set
-
+people=People
diff --git a/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle_de.properties b/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle_de.properties
deleted file mode 100644 (file)
index 0af19c2..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-dashboard=dashboard
-people=Kontakte
-documents=Dokumente
-locations=Orte
-recentItems=neulich
-
-appTitle=Argeo Suite
-
-#
-# PEOPLE
-# org.argeo.people.ui.PeopleMsg
-#
-person=Person
-organisation=Organisation
-
-# NewPersonWizard
-firstName=Vorname
-lastName=Nachname
-salutation=Salutation
-email=E-Mail
-personWizardWindowTitle=Neue Person
-personWizardPageTitle=Kontakt erstellen
-
-# NewOrgWizard
-legalName=Name
-legalForm=Geschäftsform
-vatId=Ust ID
-orgWizardWindowTitle=Neue Organisation
-orgWizardPageTitle=Organisation erstellen
-
-
-# ContextAddressComposite
-chooseAnOrganisation=Organisation wählen
-street=Strasse
-streetComplement=Strasse Zusatz
-zipCode=PLZ
-city=Stadt
-state=Bundesland
-country=Land
-geopoint=Geopoint
-
-# FilteredOrderableEntityTable
-filterHelp=Type filter criterion separated by a space
-
-# BankAccountComposite
-accountHolder=Kontoinhaber 
-bankName=Name der Bank
-currency=Währung
-accountNumber=Kontonummer
-bankNumber=BLZ
-BIC=BIC
-IBAN=IBAN
-
-# EditJobDialog
-position=Rolle
-chosenItem=Auswahl
-department=Abteilung
-isPrimary=Ist Primär
-searchAndChooseEntity=Suche und wähle ein zugehöriges Objekt
-
-# ContactListCTab (e4)
-notes=Bemerkungen
-addAContact=Kontakt hinzufügen
-contactValue=Kontakt value
-linkedCompany=zugehörige Firma
-
-# OrgAdminInfoCTab (e4)
-paymentAccount=Geschäftskonto
-
-# OrgEditor (e4)
-orgDetails=Details
-orgActivityLog=Aktivitäten Log
-team=Team
-orgAdmin=Admin.
-
-# PersonEditor (e4)
-personDetails=Kontakt Daten
-personActivityLog=Aktivitäten Log
-personOrgs=Organisationen
-personSecurity=Sicherheit
-
-# PersonSecurityCTab (e4)
-resetPassword=Passwort zurücksetzen
-
-# Generic
-label=Beschriftung
-aCustomLabel=Eine spezifische Beschriftung
-description=Beschreibung
-value=Wert
-name=Name
-primary=Haupt-
-add=Hinzufügen
-save=Speichern
-pickUp=Aussuchen
-
-# Tags
-confirmNewTag=Das Hashtag '{0}' existiert noch nicht. WollenSie es hinzufügen?
-cannotCreateTag=Das Hashtag '{0}' existiert nicht uns Sie haben nicht die Rechte, um es hinzufügen.
diff --git a/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle_fr.properties b/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle_fr.properties
deleted file mode 100644 (file)
index 0015269..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-dashboard=dashboard
-people=contacts
-documents=documents
-locations=lieux
-recentItems=récent
-
-appTitle=Argeo Suite
-
-#
-# GENERIC
-#
-
-#
-# PEOPLE
-# org.argeo.people.ui.PeopleMsg
-#
-person=personne
-user=utilisateur
-org=organisation
-group=groupe
-
-# NewPersonWizard
-firstName=Prénom
-lastName=Nom
-salutation=Salutation
-email=Email
-personWizardWindowTitle=Nouvelle personne
-personWizardPageTitle=Créer un contact
-personWizardFeedback=Le contact a été créé
-
-# NewOrgWizard
-legalName=Nom
-legalForm=Forme légale
-vatId=ID TVA
-orgWizardWindowTitle=Nouvelle organisation
-orgWizardPageTitle=Créer une organisation
-orgWizardFeedback=L'organisation a été crée
-
-# Roles
-userAdminRole=Peut créer des utilisateurs et les modifier
-groupAdminRole=Peut créer des groupes et des organisations et les modifier
-publisherRole=Peut publier et valider du contenu
-coworkerRole=Est un membre en activité de l'organisation
-
-# Group
-chooseAMember=Choisir un membre
-
-# ContextAddressComposite
-chooseAnOrganisation=Choisir une organisation
-street=Rue
-streetComplement=Complément rue
-zipCode=Code postal
-city=Ville
-state=État
-country=Pays
-geopoint=Géocoordonnées
-
-# FilteredOrderableEntityTable
-filterHelp=Sasir les critères de filtrage séparés par des espaces 
-
-# BankAccountComposite
-accountHolder=Propriétaire du compte
-bankName=Nom de la banque
-currency=Devise
-accountNumber=Numéro de compte
-bankNumber=Numéro de banque
-BIC=BIC
-IBAN=IBAN
-
-# EditJobDialog
-position=Rôle
-chosenItem=Choisir une élément
-department=Service
-isPrimary=Principal
-searchAndChooseEntity=Cherhcer et choisir l'entitée correspondante
-
-# ContactListCTab (e4)
-notes=Notes
-addAContact=Ajouter un contact
-contactValue=Valeur
-linkedCompany=Entreprise liée
-
-# OrgAdminInfoCTab (e4)
-paymentAccount=Compte de paiement
-
-# OrgEditor (e4)
-orgDetails=Détails
-orgActivityLog=Activités
-team=Équipe
-orgAdmin=Admin.
-
-# PersonEditor (e4)
-personDetails=Détails du contact
-personActivityLog=Activités
-personOrgs=Organisations
-personSecurity=Accès
-
-# PersonSecurityCTab (e4)
-resetPassword=Force le mot de passe
-
-# Generic
-label=Étiquette
-aCustomLabel=Une étiquette spécifique
-description=Description
-value=Valeur
-name=Nom
-primary=Principal
-add=Ajouter
-save=Sauver
-pickUp=Choisir
-
-# Tags
-confirmNewTag=Le tag #{0} n'existe pas encore. Voulez-vous le créer?
-cannotCreateTag=Le tag #{0} n'existe pas encore et vous n'avez pas les droits pour le créer.
-
-# Feedback messages
-allFieldsMustBeSet=Toutes les données doivent être renseignées
index 7583aa198c40b3c7a8cbf62ece51fa21439896df..a6204382e807e24b0510a3b74f6c0d10b68c1dfb 100644 (file)
@@ -11,5 +11,5 @@ argeo.library.ui.contentLayer
 argeo.people.ui.peopleLayer
 argeo.geo.ui.mapLayer
    </property>
-   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.app.ui.SuiteLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
+   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.app.swt.ux.SwtAppLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
 </scr:component>
index 1e72041b570052359b078e6360a904471b2c5bc9..44f7a0e45ad00d097c683fdad90ca94c9e606857 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Map Layer">
-   <implementation class="org.argeo.app.ui.DefaultEditionLayer"/>
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
    <properties entry="config/mapLayer.properties"/>
    <service>
-      <provide interface="org.argeo.app.ui.SuiteLayer"/>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
    </service>
    <property name="service.ranking" type="Integer" value="-1000"/>
    <reference bind="setWorkArea" cardinality="1..1" interface="org.argeo.cms.swt.acr.SwtUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.geo.ui.overviewMap)"/>
index 95bc27dd30235b03a1a58879a1d3d6ffccc527bf..a81391ff6a4814404189350f78ff3f2bc5ae3646 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="People Layer">
-   <implementation class="org.argeo.app.ui.DefaultEditionLayer"/>
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
    <properties entry="config/peopleLayer.properties"/>
    <service>
-      <provide interface="org.argeo.app.ui.SuiteLayer"/>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
    </service>
    <property name="service.ranking" type="Integer" value="-1000"/>
    <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.swt.acr.SwtUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.people.ui.peopleEntryArea)"/>
index a3ffef3dfb9fc75b4d20497c93621cd96790b3e8..ecfea87a5537d7074f16ddb283112d626b270c83 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Terms Layer">
-   <implementation class="org.argeo.app.ui.DefaultEditionLayer"/>
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
    <service>
-      <provide interface="org.argeo.app.ui.SuiteLayer"/>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
    </service>
    <property name="service.ranking" type="Integer" value="-1000"/>
    <properties entry="config/termsLayer.properties"/>
index dc316bd00d265d55640c386209a1a4d41ed535f1..7a419ca34f4da36116c182a3c0253b0c0084df0d 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy">
-   <implementation class="org.argeo.app.ui.DefaultEditionLayer"/>
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
    <properties entry="config/wwwLayer.properties"/>
    <service>
-      <provide interface="org.argeo.app.ui.SuiteLayer"/>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
    </service>
    <property name="service.ranking" type="Integer" value="-1000"/>
    <reference bind="setWorkArea" cardinality="1..1" interface="org.argeo.cms.swt.acr.SwtUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.publishing.ui.documentUiProvider)"/>
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultEditionLayer.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultEditionLayer.java
deleted file mode 100644 (file)
index dfccbe2..0000000
+++ /dev/null
@@ -1,315 +0,0 @@
-package org.argeo.app.ui;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.argeo.api.acr.Content;
-import org.argeo.cms.Localized;
-import org.argeo.cms.swt.CmsSwtTheme;
-import org.argeo.cms.swt.CmsSwtUtils;
-import org.argeo.cms.swt.acr.SwtTabbedArea;
-import org.argeo.cms.swt.acr.SwtUiProvider;
-import org.argeo.cms.util.LangUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.wiring.BundleWiring;
-
-/** An app layer based on an entry area and an editor area. */
-public class DefaultEditionLayer implements SuiteLayer {
-       private String id;
-       private SwtUiProvider entryArea;
-       private SwtUiProvider defaultView;
-       private SwtUiProvider workArea;
-       private List<String> weights = new ArrayList<>();
-       private boolean startMaximized = false;
-       private boolean fixedEntryArea = false;
-       private boolean singleTab = false;
-       private Localized title = null;
-       private Localized singleTabTitle = null;
-
-       @Override
-       public Control createUiPart(Composite parent, Content context) {
-               // TODO Factorize more, or split into more specialised classes?
-               if (entryArea != null) {
-                       if (fixedEntryArea) {
-                               FixedEditionArea editionArea = new FixedEditionArea(parent, parent.getStyle());
-                               Control entryAreaC = entryArea.createUiPart(editionArea.getEntryArea(), context);
-                               CmsSwtUtils.style(entryAreaC, SuiteStyle.entryArea);
-                               if (this.defaultView != null) {
-                                       editionArea.getTabbedArea().view(defaultView, context);
-                               }
-                               return editionArea;
-                       } else {
-                               SashFormEditionArea editionArea = new SashFormEditionArea(parent, parent.getStyle());
-                               entryArea.createUiPart(editionArea.getEntryArea(), context);
-                               if (this.defaultView != null) {
-                                       editionArea.getTabbedArea().view(defaultView, context);
-                               }
-                               return editionArea;
-                       }
-               } else {
-                       if (this.workArea != null) {
-                               Composite area = new Composite(parent, SWT.NONE);
-                               this.workArea.createUiPart(area, context);
-                               return area;
-                       }
-                       CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
-                       SwtTabbedArea tabbedArea = createTabbedArea(parent, theme);
-                       return tabbedArea;
-               }
-       }
-
-       @Override
-       public void view(SwtUiProvider uiProvider, Composite workAreaC, Content context) {
-               if (workArea != null) {
-                       CmsSwtUtils.clear(workAreaC);
-                       workArea.createUiPart(workAreaC, context);
-                       workAreaC.layout(true, true);
-                       return;
-               }
-
-               // tabbed area
-               SwtTabbedArea tabbedArea = findTabbedArea(workAreaC);
-               if (tabbedArea == null)
-                       throw new IllegalArgumentException("Unsupported work area " + workAreaC.getClass().getName());
-               if (uiProvider == null) {
-                       // reset
-                       tabbedArea.closeAllTabs();
-                       if (this.defaultView != null) {
-                               tabbedArea.view(defaultView, context);
-                       }
-               } else {
-                       tabbedArea.view(uiProvider, context);
-               }
-       }
-
-       @Override
-       public Content getCurrentContext(Composite workArea) {
-               SwtTabbedArea tabbedArea = findTabbedArea(workArea);
-               if (tabbedArea == null)
-                       return null;
-               return tabbedArea.getCurrentContext();
-       }
-
-       private SwtTabbedArea findTabbedArea(Composite workArea) {
-               SwtTabbedArea tabbedArea = null;
-               if (workArea instanceof SashFormEditionArea) {
-                       tabbedArea = ((SashFormEditionArea) workArea).getTabbedArea();
-               } else if (workArea instanceof FixedEditionArea) {
-                       tabbedArea = ((FixedEditionArea) workArea).getTabbedArea();
-               } else if (workArea instanceof SwtTabbedArea) {
-                       tabbedArea = (SwtTabbedArea) workArea;
-               }
-               return tabbedArea;
-       }
-
-       @Override
-       public void open(SwtUiProvider uiProvider, Composite workArea, Content context) {
-               SwtTabbedArea tabbedArea = ((SashFormEditionArea) workArea).getTabbedArea();
-               tabbedArea.open(uiProvider, context);
-       }
-
-       @Override
-       public Localized getTitle() {
-               return title;
-       }
-
-       @Override
-       public String getId() {
-               return id;
-       }
-
-       public void init(BundleContext bundleContext, Map<String, Object> properties) {
-               String pid = (String) properties.get(Constants.SERVICE_PID);
-               id = pid;
-
-               weights = LangUtils.toStringList(properties.get(Property.weights.name()));
-               startMaximized = properties.containsKey(Property.startMaximized.name())
-                               && "true".equals(properties.get(Property.startMaximized.name()));
-               fixedEntryArea = properties.containsKey(Property.fixedEntryArea.name())
-                               && "true".equals(properties.get(Property.fixedEntryArea.name()));
-               if (fixedEntryArea && weights.size() != 0) {
-                       throw new IllegalArgumentException("Property " + Property.weights.name() + " should not be set if property "
-                                       + Property.fixedEntryArea.name() + " is set.");
-               }
-               singleTab = properties.containsKey(Property.singleTab.name())
-                               && "true".equals(properties.get(Property.singleTab.name()));
-
-               String titleStr = (String) properties.get(SuiteLayer.Property.title.name());
-               if (titleStr != null) {
-                       if (titleStr.startsWith("%")) {
-                               title = new Localized() {
-
-                                       @Override
-                                       public String name() {
-                                               return titleStr;
-                                       }
-
-                                       @Override
-                                       public ClassLoader getL10nClassLoader() {
-                                               return bundleContext != null
-                                                               ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
-                                                               : getClass().getClassLoader();
-                                       }
-                               };
-                       } else {
-                               title = new Localized.Untranslated(titleStr);
-                       }
-               }
-
-               String singleTabTitleStr = (String) properties.get(SuiteLayer.Property.singleTabTitle.name());
-               if (singleTabTitleStr != null) {
-                       if (singleTabTitleStr.startsWith("%")) {
-                               singleTabTitle = new Localized() {
-
-                                       @Override
-                                       public String name() {
-                                               return singleTabTitleStr;
-                                       }
-
-                                       @Override
-                                       public ClassLoader getL10nClassLoader() {
-                                               return bundleContext != null
-                                                               ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
-                                                               : getClass().getClassLoader();
-                                       }
-                               };
-                       } else {
-                               singleTabTitle = new Localized.Untranslated(singleTabTitleStr);
-                       }
-               }
-
-       }
-
-       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
-
-       }
-
-       public void setEntryArea(SwtUiProvider entryArea) {
-               this.entryArea = entryArea;
-       }
-
-       public void setWorkArea(SwtUiProvider workArea) {
-               this.workArea = workArea;
-       }
-
-       public void setDefaultView(SwtUiProvider defaultView) {
-               this.defaultView = defaultView;
-       }
-
-       SwtTabbedArea createTabbedArea(Composite parent, CmsSwtTheme theme) {
-               SwtTabbedArea tabbedArea = new SwtTabbedArea(parent, SWT.NONE);
-               tabbedArea.setSingleTab(singleTab);
-               if (singleTabTitle != null)
-                       tabbedArea.setSingleTabTitle(singleTabTitle.lead());
-               tabbedArea.setBodyStyle(SuiteStyle.mainTabBody.style());
-               tabbedArea.setTabStyle(SuiteStyle.mainTab.style());
-               tabbedArea.setTabSelectedStyle(SuiteStyle.mainTabSelected.style());
-               tabbedArea.setCloseIcon(theme.getSmallIcon(SuiteIcon.close));
-               tabbedArea.setLayoutData(CmsSwtUtils.fillAll());
-               return tabbedArea;
-       }
-
-//     /** A work area based on an entry area and and a tabbed area. */
-       class SashFormEditionArea extends SashForm {
-               private static final long serialVersionUID = 2219125778722702618L;
-               private SwtTabbedArea tabbedArea;
-               private Composite entryC;
-
-               SashFormEditionArea(Composite parent, int style) {
-                       super(parent, SWT.HORIZONTAL);
-                       CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
-
-                       Composite editorC;
-                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
-                               editorC = new Composite(this, SWT.BORDER);
-                               entryC = new Composite(this, SWT.BORDER);
-                       } else {
-                               entryC = new Composite(this, SWT.NONE);
-                               editorC = new Composite(this, SWT.NONE);
-                       }
-
-                       // sash form specific
-                       if (weights.size() != 0) {
-                               int[] actualWeight = new int[weights.size()];
-                               for (int i = 0; i < weights.size(); i++) {
-                                       actualWeight[i] = Integer.parseInt(weights.get(i));
-                               }
-                               setWeights(actualWeight);
-                       } else {
-                               int[] actualWeights = new int[] { 3000, 7000 };
-                               setWeights(actualWeights);
-                       }
-                       if (startMaximized)
-                               setMaximizedControl(editorC);
-
-                       GridLayout editorAreaLayout = CmsSwtUtils.noSpaceGridLayout();
-//                     editorAreaLayout.verticalSpacing = 0;
-//                     editorAreaLayout.marginBottom = 0;
-//                     editorAreaLayout.marginHeight = 0;
-//                     editorAreaLayout.marginLeft = 0;
-//                     editorAreaLayout.marginRight = 0;
-                       editorC.setLayout(editorAreaLayout);
-
-                       tabbedArea = createTabbedArea(editorC, theme);
-               }
-
-               SwtTabbedArea getTabbedArea() {
-                       return tabbedArea;
-               }
-
-               Composite getEntryArea() {
-                       return entryC;
-               }
-
-       }
-
-       class FixedEditionArea extends Composite {
-               private static final long serialVersionUID = -5525672639277322465L;
-               private SwtTabbedArea tabbedArea;
-               private Composite entryC;
-
-               public FixedEditionArea(Composite parent, int style) {
-                       super(parent, style);
-                       CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
-
-                       setLayout(CmsSwtUtils.noSpaceGridLayout(2));
-
-                       Composite editorC;
-                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
-                               editorC = new Composite(this, SWT.NONE);
-                               entryC = new Composite(this, SWT.NONE);
-                       } else {
-                               entryC = new Composite(this, SWT.NONE);
-                               editorC = new Composite(this, SWT.NONE);
-                       }
-                       entryC.setLayoutData(CmsSwtUtils.fillHeight());
-
-                       GridLayout editorAreaLayout = CmsSwtUtils.noSpaceGridLayout();
-//                     editorAreaLayout.verticalSpacing = 0;
-//                     editorAreaLayout.marginBottom = 0;
-//                     editorAreaLayout.marginHeight = 0;
-//                     editorAreaLayout.marginLeft = 0;
-//                     editorAreaLayout.marginRight = 0;
-                       editorC.setLayout(editorAreaLayout);
-                       editorC.setLayoutData(CmsSwtUtils.fillAll());
-
-                       tabbedArea = createTabbedArea(editorC, theme);
-               }
-
-               SwtTabbedArea getTabbedArea() {
-                       return tabbedArea;
-               }
-
-               Composite getEntryArea() {
-                       return entryC;
-               }
-       }
-
-}
\ No newline at end of file
index 9231f4a3773e5dd335051d577f42e0cd28b7534b..ede28d124db81ed999f91e963375fbe0ad446be5 100644 (file)
@@ -4,6 +4,8 @@ import java.util.Map;
 
 import org.argeo.api.acr.Content;
 import org.argeo.api.cms.ux.CmsView;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteStyle;
 import org.argeo.cms.CurrentUser;
 import org.argeo.cms.Localized;
 import org.argeo.cms.swt.CmsSwtTheme;
index 0f3fb2eade49a46230f40f39e0596f0bcaa6d3f0..9a2faf5da00f3edf98be96d551801bb1defdc805 100644 (file)
@@ -13,6 +13,9 @@ import org.argeo.api.cms.CmsLog;
 import org.argeo.api.cms.ux.CmsView;
 import org.argeo.app.api.RankedObject;
 import org.argeo.app.core.SuiteUtils;
+import org.argeo.app.swt.ux.SwtAppLayer;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteStyle;
 import org.argeo.cms.CurrentUser;
 import org.argeo.cms.Localized;
 import org.argeo.cms.swt.CmsSwtUtils;
@@ -35,7 +38,7 @@ public class DefaultLeadPane implements CmsUiProvider {
                defaultLayers, adminLayers;
        }
 
-       private Map<String, RankedObject<SuiteLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
+       private Map<String, RankedObject<SwtAppLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
        private List<String> defaultLayers;
        private List<String> adminLayers = new ArrayList<>();
 
@@ -98,11 +101,11 @@ public class DefaultLeadPane implements CmsUiProvider {
 //                                     if (intersection.isEmpty())
 //                                             continue layers;// skip unauthorized layer
                                }
-                               RankedObject<SuiteLayer> layerObj = layers.get(layerId);
+                               RankedObject<SwtAppLayer> layerObj = layers.get(layerId);
 
                                Localized title = null;
                                if (!adminLayers.contains(layerId)) {
-                                       String titleStr = (String) layerObj.getProperties().get(SuiteLayer.Property.title.name());
+                                       String titleStr = (String) layerObj.getProperties().get(SwtAppLayer.Property.title.name());
                                        if (titleStr != null) {
                                                if (titleStr.startsWith("%")) {
                                                        // LocaleUtils.local(titleStr, getClass().getClassLoader());
@@ -113,7 +116,7 @@ public class DefaultLeadPane implements CmsUiProvider {
                                        }
                                }
 
-                               String iconName = (String) layerObj.getProperties().get(SuiteLayer.Property.icon.name());
+                               String iconName = (String) layerObj.getProperties().get(SwtAppLayer.Property.icon.name());
                                SuiteIcon icon = null;
                                if (iconName != null)
                                        icon = SuiteIcon.valueOf(iconName);
@@ -153,18 +156,18 @@ public class DefaultLeadPane implements CmsUiProvider {
 
        }
 
-       public void addLayer(SuiteLayer layer, Map<String, Object> properties) {
+       public void addLayer(SwtAppLayer layer, Map<String, Object> properties) {
                if (properties.containsKey(Constants.SERVICE_PID)) {
                        String pid = (String) properties.get(Constants.SERVICE_PID);
                        RankedObject.putIfHigherRank(layers, pid, layer, properties);
                }
        }
 
-       public void removeLayer(SuiteLayer layer, Map<String, Object> properties) {
+       public void removeLayer(SwtAppLayer layer, Map<String, Object> properties) {
                if (properties.containsKey(Constants.SERVICE_PID)) {
                        String pid = (String) properties.get(Constants.SERVICE_PID);
                        if (layers.containsKey(pid)) {
-                               if (layers.get(pid).equals(new RankedObject<SuiteLayer>(layer, properties))) {
+                               if (layers.get(pid).equals(new RankedObject<SwtAppLayer>(layer, properties))) {
                                        layers.remove(pid);
                                }
                        }
index 03927d42d77fd282bb97135f6aec3ca02b8ea2e4..e16b7d6fe6ac4b86d7561f9893bd315a7d46fa47 100644 (file)
@@ -18,6 +18,8 @@ import javax.jcr.query.QueryResult;
 import org.argeo.app.api.EntityType;
 import org.argeo.app.core.XPathUtils;
 import org.argeo.app.ui.widgets.DelayedText;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteUxEvent;
 import org.argeo.cms.swt.CmsSwtTheme;
 import org.argeo.cms.swt.CmsSwtUtils;
 import org.argeo.cms.ui.CmsUiProvider;
@@ -106,7 +108,7 @@ public class RecentItems implements CmsUiProvider {
                                Node node = (Node) entityViewer.getViewer().getStructuredSelection().getFirstElement();
                                if (node != null)
                                        CmsSwtUtils.getCmsView(parent).sendEvent(SuiteUxEvent.openNewPart.topic(),
-                                                       SuiteUxEvent.eventProperties(node));
+                                                       SuiteUiUtils.eventProperties(node));
 
                        }
                });
@@ -115,7 +117,7 @@ public class RecentItems implements CmsUiProvider {
                                Node node = (Node) entityViewer.getViewer().getStructuredSelection().getFirstElement();
                                if (node != null) {
                                        CmsSwtUtils.getCmsView(parent).sendEvent(SuiteUxEvent.refreshPart.topic(),
-                                                       SuiteUxEvent.eventProperties(node));
+                                                       SuiteUiUtils.eventProperties(node));
                                        deleteItem.setEnabled(true);
                                } else {
                                        deleteItem.setEnabled(false);
index 3dc5007fc0be274380ee18dd68436a30b62e9bc5..854268cc24807751836ab77086fe865e29409b51 100644 (file)
@@ -34,6 +34,9 @@ import org.argeo.app.api.EntityNames;
 import org.argeo.app.api.EntityType;
 import org.argeo.app.api.RankedObject;
 import org.argeo.app.core.SuiteUtils;
+import org.argeo.app.swt.ux.SwtAppUi;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.app.swt.ux.SwtAppLayer;
 import org.argeo.cms.AbstractCmsApp;
 import org.argeo.cms.LocaleUtils;
 import org.argeo.cms.Localized;
@@ -85,13 +88,13 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
        // TODO use QName as key for byType
        private Map<String, RankedObject<SwtUiProvider>> uiProvidersByPid = Collections.synchronizedMap(new HashMap<>());
        private Map<String, RankedObject<SwtUiProvider>> uiProvidersByType = Collections.synchronizedMap(new HashMap<>());
-       private Map<String, RankedObject<SuiteLayer>> layersByPid = Collections.synchronizedSortedMap(new TreeMap<>());
-       private Map<String, RankedObject<SuiteLayer>> layersByType = Collections.synchronizedSortedMap(new TreeMap<>());
+       private Map<String, RankedObject<SwtAppLayer>> layersByPid = Collections.synchronizedSortedMap(new TreeMap<>());
+       private Map<String, RankedObject<SwtAppLayer>> layersByType = Collections.synchronizedSortedMap(new TreeMap<>());
 
        private CmsUserManager cmsUserManager;
 
        // TODO make more optimal or via CmsSession/CmsView
-       private Map<String, SuiteUi> managedUis = new HashMap<>();
+       private Map<String, SwtAppUi> managedUis = new HashMap<>();
 
        // ACR
        private ContentRepository contentRepository;
@@ -134,7 +137,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
        }
 
        public void destroy(Map<String, Object> properties) {
-               for (SuiteUi ui : managedUis.values())
+               for (SwtAppUi ui : managedUis.values())
                        if (!ui.isDisposed()) {
                                ui.getDisplay().syncExec(() -> ui.dispose());
                        }
@@ -162,7 +165,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                CmsTheme theme = getTheme(uiName);
                if (theme != null)
                        CmsSwtUtils.registerCmsTheme(uiParent.getShell(), theme);
-               SuiteUi argeoSuiteUi = new SuiteUi(uiParent, SWT.INHERIT_DEFAULT);
+               SwtAppUi argeoSuiteUi = new SwtAppUi(uiParent, SWT.INHERIT_DEFAULT);
                String uid = cmsView.getUid();
                managedUis.put(uid, argeoSuiteUi);
                argeoSuiteUi.addDisposeListener((e) -> {
@@ -185,7 +188,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
        public void refreshUi(CmsUi cmsUi, String state) {
                try {
                        Content context = null;
-                       SuiteUi ui = (SuiteUi) cmsUi;
+                       SwtAppUi ui = (SwtAppUi) cmsUi;
 
                        String uiName = Objects.toString(ui.getParent().getData(UI_NAME_PROPERTY), null);
                        if (uiName == null)
@@ -255,7 +258,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                                        refreshPart(headerUiProvider, ui.getHeader(), context);
                                ui.refreshBelowHeader(true);
                                for (String key : layersByPid.keySet()) {
-                                       SuiteLayer layer = layersByPid.get(key).get();
+                                       SwtAppLayer layer = layersByPid.get(key).get();
                                        ui.addLayer(key, layer);
                                }
 
@@ -291,7 +294,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                return uiProvidersByPid.get(pid).get();
        }
 
-       private SuiteLayer findLayer(String pid) {
+       private SwtAppLayer findLayer(String pid) {
                if (!layersByPid.containsKey(pid))
                        return null;
                return layersByPid.get(pid).get();
@@ -401,8 +404,8 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                if (state == null)
                        return;
                if (!state.startsWith("/")) {
-                       if (cmsUi instanceof SuiteUi) {
-                               SuiteUi ui = (SuiteUi) cmsUi;
+                       if (cmsUi instanceof SwtAppUi) {
+                               SwtAppUi ui = (SwtAppUi) cmsUi;
                                if (LOGIN.equals(state)) {
                                        String appTitle = "";
                                        if (ui.getTitle() != null)
@@ -418,7 +421,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                        }
                        return;
                }
-               SuiteUi suiteUi = (SuiteUi) cmsUi;
+               SwtAppUi suiteUi = (SwtAppUi) cmsUi;
                if (suiteUi.isLoginScreen()) {
                        return;
                }
@@ -437,7 +440,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                return node.getPath();
        }
 
-       private Content stateToNode(SuiteUi suiteUi, String state) {
+       private Content stateToNode(SwtAppUi suiteUi, String state) {
                if (suiteUi == null)
                        return null;
                if (state == null || !state.startsWith("/"))
@@ -458,7 +461,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
        public void onEvent(String topic, Map<String, Object> event) {
 
                // Specific UI related events
-               SuiteUi ui = getRelatedUi(event);
+               SwtAppUi ui = getRelatedUi(event);
                if (ui == null)
                        return;
                ui.getCmsView().runAs(() -> {
@@ -472,7 +475,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                                        if (node == null)
                                                return;
                                        SwtUiProvider uiProvider = findByType(uiProvidersByType, node);
-                                       SuiteLayer layer = findByType(layersByType, node);
+                                       SwtAppLayer layer = findByType(layersByType, node);
                                        ui.switchToLayer(layer, node);
                                        layer.view(uiProvider, ui.getCurrentWorkArea(), node);
                                        ui.getCmsView().stateChanged(nodeToState(node), appTitle + CmsUxUtils.getTitle(node));
@@ -481,14 +484,14 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                                        if (node == null)
                                                return;
                                        SwtUiProvider uiProvider = findByType(uiProvidersByType, node);
-                                       SuiteLayer layer = findByType(layersByType, node);
+                                       SwtAppLayer layer = findByType(layersByType, node);
                                        ui.switchToLayer(layer, node);
                                        layer.open(uiProvider, ui.getCurrentWorkArea(), node);
                                        ui.getCmsView().stateChanged(nodeToState(node), appTitle + CmsUxUtils.getTitle(node));
                                } else if (SuiteUiUtils.isTopic(topic, SuiteUxEvent.switchLayer)) {
                                        String layerId = get(event, SuiteUxEvent.LAYER);
                                        if (layerId != null) {
-                                               SuiteLayer suiteLayer = findLayer(layerId);
+                                               SwtAppLayer suiteLayer = findLayer(layerId);
                                                if (suiteLayer == null)
                                                        throw new IllegalArgumentException("No layer '" + layerId + "' available.");
                                                Localized layerTitle = suiteLayer.getTitle();
@@ -517,7 +520,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                                        } else {
                                                Content node = getContentFromEvent(ui, event);
                                                if (node != null) {
-                                                       SuiteLayer layer = findByType(layersByType, node);
+                                                       SwtAppLayer layer = findByType(layersByType, node);
                                                        ui.switchToLayer(layer, node);
                                                }
                                        }
@@ -529,7 +532,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                });
        }
 
-       protected Content getContentFromEvent(SuiteUi ui, Map<String, Object> event) {
+       protected Content getContentFromEvent(SwtAppUi ui, Map<String, Object> event) {
                ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository,
                                ui.getCmsView());
 
@@ -553,7 +556,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                return node;
        }
 
-       private SuiteUi getRelatedUi(Map<String, Object> eventProperties) {
+       private SwtAppUi getRelatedUi(Map<String, Object> eventProperties) {
                return managedUis.get(get(eventProperties, CMS_VIEW_UID_PROPERTY));
        }
 
@@ -603,7 +606,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                }
        }
 
-       public void addLayer(SuiteLayer layer, Map<String, Object> properties) {
+       public void addLayer(SwtAppLayer layer, Map<String, Object> properties) {
                if (properties.containsKey(Constants.SERVICE_PID)) {
                        String pid = (String) properties.get(Constants.SERVICE_PID);
                        RankedObject.putIfHigherRank(layersByPid, pid, layer, properties);
@@ -615,11 +618,11 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                }
        }
 
-       public void removeLayer(SuiteLayer layer, Map<String, Object> properties) {
+       public void removeLayer(SwtAppLayer layer, Map<String, Object> properties) {
                if (properties.containsKey(Constants.SERVICE_PID)) {
                        String pid = (String) properties.get(Constants.SERVICE_PID);
                        if (layersByPid.containsKey(pid)) {
-                               if (layersByPid.get(pid).equals(new RankedObject<SuiteLayer>(layer, properties))) {
+                               if (layersByPid.get(pid).equals(new RankedObject<SwtAppLayer>(layer, properties))) {
                                        layersByPid.remove(pid);
                                }
                        }
@@ -628,7 +631,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                        List<String> types = LangUtils.toStringList(properties.get(EntityConstants.TYPE));
                        for (String type : types) {
                                if (layersByType.containsKey(type)) {
-                                       if (layersByType.get(type).equals(new RankedObject<SuiteLayer>(layer, properties))) {
+                                       if (layersByType.get(type).equals(new RankedObject<SwtAppLayer>(layer, properties))) {
                                                layersByType.remove(type);
                                        }
                                }
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteIcon.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteIcon.java
deleted file mode 100644 (file)
index fae2852..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.argeo.app.ui;
-
-import org.argeo.api.cms.ux.CmsIcon;
-
-/** Icon names used by Argeo Suite. */
-public enum SuiteIcon implements CmsIcon {
-       add, save, close, closeAll, search, delete, logout, dashboard,
-       // people
-       people, group, person, organisation, addressBook, users, organisationContact,
-       // library
-       documents, document, folder,
-       // management
-       report,
-       // admin and settings
-       settings, user,
-       // misc
-       task, tag, location, inbox, map, todo,
-       // actions
-       openUserMenu,
-       //
-       ;
-}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteLayer.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteLayer.java
deleted file mode 100644 (file)
index 6ee8ca0..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.argeo.app.ui;
-
-import org.argeo.api.acr.Content;
-import org.argeo.cms.Localized;
-import org.argeo.cms.swt.acr.SwtUiProvider;
-import org.eclipse.swt.widgets.Composite;
-
-/** An UI layer for the main work area. */
-public interface SuiteLayer extends SwtUiProvider {
-       static enum Property {
-               title, icon, weights, startMaximized, singleTab, singleTabTitle, fixedEntryArea;
-       }
-
-       String getId();
-
-       void view(SwtUiProvider uiProvider, Composite workArea, Content context);
-
-       Content getCurrentContext(Composite workArea);
-
-       default void open(SwtUiProvider uiProvider, Composite workArea, Content context) {
-               view(uiProvider, workArea, context);
-       }
-
-       default Localized getTitle() {
-               return null;
-       }
-}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteMsg.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteMsg.java
deleted file mode 100644 (file)
index 4d515d7..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.argeo.app.ui;
-
-import org.argeo.cms.Localized;
-
-/** Localized messages. */
-public enum SuiteMsg implements Localized {
-       // Entities
-       user, org, person, group,
-       // UI parts
-       dashboard, people, documents, locations, recentItems,
-       // NewPersonWizard
-       firstName, lastName, salutation, email, personWizardWindowTitle, personWizardPageTitle, personWizardFeedback,
-       // NewOrgWizard
-       orgWizardWindowTitle, orgWizardPageTitle, orgWizardFeedback, legalName, legalForm, vatId,
-       // Roles
-       userAdminRole, groupAdminRole, publisherRole, coworkerRole,
-       // Group
-       chooseAMember,
-       // ContextAddressComposite
-       chooseAnOrganisation, street, streetComplement, zipCode, city, state, country, geopoint,
-       // FilteredOrderableEntityTable
-       filterHelp,
-       // BankAccountComposite
-       accountHolder, bankName, currency, accountNumber, bankNumber, BIC, IBAN,
-       // EditJobDialog
-       position, chosenItem, department, isPrimary, searchAndChooseEntity,
-       // ContactListCTab (e4)
-       notes, addAContact, contactValue, linkedCompany,
-       // OrgAdminInfoCTab (e4)
-       paymentAccount,
-       // OrgEditor (e4)
-       orgDetails, orgActivityLog, team, orgAdmin,
-       // PersonEditor (e4)
-       personDetails, personActivityLog, personOrgs, personSecurity,
-       // PersonSecurityCTab (e4)
-       resetPassword,
-       // Generic
-       label, aCustomLabel, description, value, name, primary, add, save, pickup,
-       // Tag
-       confirmNewTag, cannotCreateTag,
-       // Feedback messages
-       allFieldsMustBeSet,
-       //
-       ;
-}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteStyle.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteStyle.java
deleted file mode 100644 (file)
index 1afff73..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.argeo.app.ui;
-
-import org.argeo.api.cms.ux.CmsStyle;
-
-/** Styles used by Argeo Suite work UI. */
-public enum SuiteStyle implements CmsStyle {
-       // header
-       header, headerTitle, headerMenu, headerMenuItem,
-       // footer
-       footer,
-       // recent items
-       recentItems,
-       // lead pane
-       leadPane, leadPaneItem, leadPaneSectionTitle, leadPaneSubSectionTitle,
-       // entry area
-       entryArea,
-       // group composite
-       titleContainer, titleLabel, subTitleLabel, formLine, formColumn, navigationBar, navigationTitle, navigationButton,
-       // forms elements
-       simpleLabel, simpleText, simpleInput,
-       // table
-       titleCell,
-       // layers
-       workArea,
-       // tabbed area
-       mainTabBody, mainTabSelected, mainTab,
-       // buttons
-       inlineButton;
-
-       @Override
-       public String getClassPrefix() {
-               return "argeo-suite";
-       }
-
-}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUi.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUi.java
deleted file mode 100644 (file)
index c332929..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-package org.argeo.app.ui;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.argeo.api.acr.Content;
-import org.argeo.api.cms.CmsLog;
-import org.argeo.cms.Localized;
-import org.argeo.cms.swt.CmsSwtUi;
-import org.argeo.cms.swt.CmsSwtUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/** The view for the default UX of Argeo Suite. */
-class SuiteUi extends CmsSwtUi {
-       private static final long serialVersionUID = 6207018859086689108L;
-       private final static CmsLog log = CmsLog.getLog(SuiteUi.class);
-
-       private Localized title;
-       private Composite header;
-       private Composite footer;
-       private Composite belowHeader;
-       private Composite leadPane;
-       private Composite sidePane;
-       private Composite dynamicArea;
-
-       private Content userDir;
-
-       private Map<String, SuiteLayer> layers = new HashMap<>();
-       private Map<String, Composite> workAreas = new HashMap<>();
-       private String currentLayerId = null;
-
-       private boolean loginScreen = false;
-
-       public SuiteUi(Composite parent, int style) {
-               super(parent, style);
-               this.setLayout(CmsSwtUtils.noSpaceGridLayout());
-
-               header = new Composite(this, SWT.NONE);
-               header.setLayout(CmsSwtUtils.noSpaceGridLayout());
-               CmsSwtUtils.style(header, SuiteStyle.header);
-               header.setLayoutData(CmsSwtUtils.fillWidth());
-
-               belowHeader = new Composite(this, SWT.NONE);
-               belowHeader.setLayoutData(CmsSwtUtils.fillAll());
-
-               footer = new Composite(this, SWT.NONE);
-               footer.setLayout(CmsSwtUtils.noSpaceGridLayout());
-               CmsSwtUtils.style(footer, SuiteStyle.footer);
-               footer.setLayoutData(CmsSwtUtils.fillWidth());
-       }
-
-       public void refreshBelowHeader(boolean initApp) {
-               CmsSwtUtils.clear(belowHeader);
-               int style = getStyle();
-               if (initApp) {
-                       belowHeader.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
-
-                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
-                               sidePane = new Composite(belowHeader, SWT.NONE);
-                               sidePane.setLayout(CmsSwtUtils.noSpaceGridLayout());
-                               sidePane.setLayoutData(CmsSwtUtils.fillHeight());
-                               dynamicArea = new Composite(belowHeader, SWT.NONE);
-                               leadPane = new Composite(belowHeader, SWT.NONE);
-                       } else {
-                               leadPane = new Composite(belowHeader, SWT.NONE);
-                               dynamicArea = new Composite(belowHeader, SWT.NONE);
-                               sidePane = new Composite(belowHeader, SWT.NONE);
-                               sidePane.setLayout(CmsSwtUtils.noSpaceGridLayout());
-                               sidePane.setLayoutData(CmsSwtUtils.fillHeight());
-                       }
-                       leadPane.setLayoutData(CmsSwtUtils.fillHeight());
-                       leadPane.setLayout(CmsSwtUtils.noSpaceGridLayout());
-                       CmsSwtUtils.style(leadPane, SuiteStyle.leadPane);
-
-                       dynamicArea.setLayoutData(CmsSwtUtils.fillAll());
-                       dynamicArea.setLayout(new FormLayout());
-
-               } else {
-                       belowHeader.setLayout(CmsSwtUtils.noSpaceGridLayout());
-               }
-       }
-
-       /*
-        * LAYERS
-        */
-
-       Composite getCurrentWorkArea() {
-               if (currentLayerId == null)
-                       throw new IllegalStateException("No current layer");
-               return workAreas.get(currentLayerId);
-       }
-
-       String getCurrentLayerId() {
-               return currentLayerId;
-       }
-
-       private Composite getLayer(String id, Content context) {
-               if (!layers.containsKey(id))
-                       return null;
-               if (!workAreas.containsKey(id))
-                       initLayer(id, layers.get(id), context);
-               return workAreas.get(id);
-       }
-
-       Composite switchToLayer(String layerId, Content context) {
-               Composite current = null;
-               if (currentLayerId != null) {
-                       current = getCurrentWorkArea();
-                       if (currentLayerId.equals(layerId))
-                               return current;
-               }
-               if (context == null) {
-                       if (!getCmsView().isAnonymous())
-                               context = getUserDir();
-               }
-               Composite toShow = getLayer(layerId, context);
-               if (toShow != null) {
-                       currentLayerId = layerId;
-                       if (!isDisposed()) {
-                               if (!toShow.isDisposed()) {
-                                       toShow.moveAbove(null);
-                               } else {
-                                       log.warn("Cannot show work area because it is disposed.");
-                                       toShow = initLayer(layerId, layers.get(layerId), context);
-                                       toShow.moveAbove(null);
-                               }
-                               dynamicArea.layout(true, true);
-                       }
-                       return toShow;
-               } else {
-                       return current;
-               }
-       }
-
-       void switchToLayer(SuiteLayer layer, Content context) {
-               // TODO make it more robust
-               for (String layerId : layers.keySet()) {
-                       SuiteLayer l = layers.get(layerId);
-                       if (layer.getId().equals(l.getId())) {
-                               switchToLayer(layerId, context);
-                               return;
-                       }
-               }
-               throw new IllegalArgumentException("Layer is not registered.");
-       }
-
-       void addLayer(String id, SuiteLayer layer) {
-               layers.put(id, layer);
-       }
-
-       void removeLayer(String id) {
-               layers.remove(id);
-               if (workAreas.containsKey(id)) {
-                       Composite workArea = workAreas.remove(id);
-                       if (!workArea.isDisposed())
-                               workArea.dispose();
-               }
-       }
-
-       protected Composite initLayer(String id, SuiteLayer layer, Content context) {
-               Composite workArea = getCmsView().doAs(() -> (Composite) layer.createUiPart(dynamicArea, context));
-               CmsSwtUtils.style(workArea, SuiteStyle.workArea);
-               workArea.setLayoutData(CmsSwtUtils.coverAll());
-               workAreas.put(id, workArea);
-               return workArea;
-       }
-
-       synchronized void logout() {
-               userDir = null;
-               currentLayerId = null;
-               workAreas.clear();
-       }
-
-       /*
-        * GETTERS / SETTERS
-        */
-
-       Composite getHeader() {
-               return header;
-       }
-
-       Composite getFooter() {
-               return footer;
-       }
-
-       Composite getLeadPane() {
-               return leadPane;
-       }
-
-       Composite getSidePane() {
-               return sidePane;
-       }
-
-       Composite getBelowHeader() {
-               return belowHeader;
-       }
-
-       Content getUserDir() {
-               return userDir;
-       }
-
-       void setUserDir(Content userDir) {
-               this.userDir = userDir;
-       }
-
-       public Localized getTitle() {
-               return title;
-       }
-
-       public void setTitle(Localized title) {
-               this.title = title;
-       }
-
-       public boolean isLoginScreen() {
-               return loginScreen;
-       }
-
-       public void setLoginScreen(boolean loginScreen) {
-               this.loginScreen = loginScreen;
-       }
-}
index 504e8eda75c87f6ea07a5b91508cad0c93bc35c0..c98847a0dd8b143f93c89fa63778d1c715fb6fd5 100644 (file)
@@ -5,6 +5,8 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Objects;
 
 import javax.jcr.Node;
@@ -19,6 +21,8 @@ import org.argeo.api.cms.ux.CmsIcon;
 import org.argeo.api.cms.ux.CmsStyle;
 import org.argeo.app.api.EntityNames;
 import org.argeo.app.api.EntityType;
+import org.argeo.app.ux.SuiteStyle;
+import org.argeo.app.ux.SuiteUxEvent;
 import org.argeo.cms.LocaleUtils;
 import org.argeo.cms.Localized;
 import org.argeo.cms.jcr.acr.JcrContent;
@@ -428,6 +432,14 @@ public class SuiteUiUtils {
                return button;
        }
 
+       @Deprecated
+       public static Map<String, Object> eventProperties(Node node) {
+               Map<String, Object> properties = new HashMap<>();
+               String contentPath = '/' + Jcr.getWorkspaceName(node) + Jcr.getPath(node);
+               properties.put(SuiteUxEvent.CONTENT_PATH, contentPath);
+               return properties;
+       }
+
 //     public static String createAndConfigureEntity(Shell shell, Session referenceSession, String mainMixin,
 //                     String... additionnalProps) {
 //
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUxEvent.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUxEvent.java
deleted file mode 100644 (file)
index 00aaddc..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.argeo.app.ui;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.jcr.Node;
-
-import org.argeo.api.acr.Content;
-import org.argeo.api.cms.CmsEvent;
-import org.argeo.jcr.Jcr;
-import org.osgi.service.useradmin.User;
-
-/** Events specific to Argeo Suite UX. */
-public enum SuiteUxEvent implements CmsEvent {
-       openNewPart, refreshPart, switchLayer;
-
-       public final static String LAYER = "layer";
-       public final static String USERNAME = "username";
-
-       // ACR
-       public final static String CONTENT_PATH = "contentPath";
-
-       public String getTopicBase() {
-               return "argeo.suite.ui";
-       }
-
-       public static Map<String, Object> eventProperties(Content content) {
-               Map<String, Object> properties = new HashMap<>();
-               properties.put(CONTENT_PATH, content.getPath());
-               return properties;
-       }
-
-       @Deprecated
-       public static Map<String, Object> eventProperties(Node node) {
-               Map<String, Object> properties = new HashMap<>();
-               String contentPath = '/' + Jcr.getWorkspaceName(node) + Jcr.getPath(node);
-               properties.put(CONTENT_PATH, contentPath);
-               return properties;
-       }
-
-       public static Map<String, Object> eventProperties(User user) {
-               Map<String, Object> properties = new HashMap<>();
-               properties.put(USERNAME, user.getName());
-               return properties;
-       }
-}
index 380330f5109f7eeaeb3d0b619366e84ef2ad8bca..54c94f8abf538be0c5586944ee4c4c153b621021 100644 (file)
@@ -1,7 +1,7 @@
 package org.argeo.app.ui.dialogs;
 
-import org.argeo.app.ui.SuiteMsg;
 import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.app.ux.SuiteMsg;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
index ee9f5b9bfd953cb0851fa65753fe11ad1cbfb893..2206c55cc5a5c6b47d0e79799b12bd05c3215a7f 100644 (file)
@@ -4,8 +4,8 @@ import static org.argeo.eclipse.ui.EclipseUiUtils.isEmpty;
 
 import javax.jcr.Node;
 
-import org.argeo.app.ui.SuiteMsg;
 import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.app.ux.SuiteMsg;
 import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.wizard.Wizard;
index 50471519f83be7924d79ac149fa741ff9748dfa5..4664758360065dadc1cb7c2c832f64572b29fc11 100644 (file)
@@ -6,7 +6,7 @@ import org.argeo.api.acr.spi.ProvidedContent;
 import org.argeo.api.cms.CmsLog;
 import org.argeo.api.cms.ux.CmsView;
 import org.argeo.app.api.EntityType;
-import org.argeo.app.ui.SuiteUxEvent;
+import org.argeo.app.ux.SuiteUxEvent;
 import org.argeo.cms.swt.CmsSwtUtils;
 import org.argeo.cms.swt.acr.SwtUiProvider;
 import org.argeo.cms.swt.widgets.SwtTreeView;
index 657a851df2a46f5edea0ba933e8edb32ed96cd20..0ae0ad741cf5d593916ea75f38bbdb3db3d87003 100644 (file)
@@ -7,7 +7,8 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
 import org.argeo.api.cms.ux.CmsView;
-import org.argeo.app.ui.SuiteUxEvent;
+import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.app.ux.SuiteUxEvent;
 import org.argeo.cms.fs.CmsFsUtils;
 import org.argeo.cms.swt.CmsSwtUtils;
 import org.argeo.cms.ui.CmsUiProvider;
@@ -29,7 +30,7 @@ public class DocumentsFolderUiProvider implements CmsUiProvider {
                        protected void externalNavigateTo(Path path) {
                                Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(Jcr.getSession(context).getRepository(), path));
                                parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
-                               cmsView.sendEvent(SuiteUxEvent.openNewPart.topic(), SuiteUxEvent.eventProperties(folderNode));
+                               cmsView.sendEvent(SuiteUxEvent.openNewPart.topic(), SuiteUiUtils.eventProperties(folderNode));
                        }
                };
                dfc.setLayoutData(CmsSwtUtils.fillAll());
index 6c0bdfc452833c70fe85c6e770a5a6fc0bfcefaa..1f91b6426208e5d12a08741dd7a1d38679536369 100644 (file)
@@ -8,7 +8,8 @@ import javax.jcr.Node;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 
-import org.argeo.app.ui.SuiteUxEvent;
+import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.app.ux.SuiteUxEvent;
 import org.argeo.api.cms.CmsConstants;
 import org.argeo.api.cms.ux.CmsView;
 import org.argeo.cms.fs.CmsFsUtils;
@@ -46,7 +47,7 @@ public class DocumentsTreeUiProvider implements CmsUiProvider {
                                if (Files.isDirectory(newSelected)) {
                                        Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
                                        parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
-                                       cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent.eventProperties(folderNode));
+                                       cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUiUtils.eventProperties(folderNode));
                                }
                        }
                });
@@ -59,7 +60,7 @@ public class DocumentsTreeUiProvider implements CmsUiProvider {
                                if (Files.isDirectory(newSelected)) {
                                        Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
                                        parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
-                                       cmsView.sendEvent(SuiteUxEvent.openNewPart.topic(), SuiteUxEvent.eventProperties(folderNode));
+                                       cmsView.sendEvent(SuiteUxEvent.openNewPart.topic(), SuiteUiUtils.eventProperties(folderNode));
                                }
                        }
                });
index 0fbb5cb6aaab1a2926783475dcd99ea78fc2e478..286a4cb54bf72f0175d8cf791d6a9cf321f175c9 100644 (file)
@@ -13,9 +13,10 @@ import javax.jcr.query.Query;
 import org.argeo.api.acr.Content;
 import org.argeo.api.cms.CmsConstants;
 import org.argeo.app.api.EntityType;
-import org.argeo.app.ui.SuiteUxEvent;
-import org.argeo.app.ui.SuiteIcon;
+import org.argeo.app.ui.SuiteUiUtils;
 import org.argeo.app.ui.widgets.TreeOrSearchArea;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteUxEvent;
 import org.argeo.cms.jcr.acr.JcrContentProvider;
 import org.argeo.cms.swt.CmsSwtTheme;
 import org.argeo.cms.swt.CmsSwtUtils;
@@ -86,7 +87,7 @@ public class JcrContentEntryArea implements CmsUiProvider {
                                Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement();
                                if (user != null) {
                                        CmsSwtUtils.getCmsView(parent).sendEvent(SuiteUxEvent.openNewPart.topic(),
-                                                       SuiteUxEvent.eventProperties(user));
+                                                       SuiteUiUtils.eventProperties(user));
                                }
 
                        }
@@ -96,7 +97,7 @@ public class JcrContentEntryArea implements CmsUiProvider {
                                Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement();
                                if (user != null) {
                                        CmsSwtUtils.getCmsView(parent).sendEvent(SuiteUxEvent.refreshPart.topic(),
-                                                       SuiteUxEvent.eventProperties(user));
+                                                       SuiteUiUtils.eventProperties(user));
                                }
                        }
                });
index 97c0e7c6cef0e32db37b63d1170183e6e2f328e6..40b33883afc590d8c9c06745c4cfebb62959c7ea 100644 (file)
@@ -15,7 +15,7 @@ import javax.jcr.RepositoryException;
 import org.apache.commons.io.IOUtils;
 import org.argeo.app.api.EntityNames;
 import org.argeo.app.api.EntityType;
-import org.argeo.app.ui.SuiteUxEvent;
+import org.argeo.app.ux.SuiteUxEvent;
 import org.argeo.api.cms.CmsLog;
 import org.argeo.api.cms.ux.CmsView;
 import org.argeo.api.cms.CmsConstants;
index f0de1ca59d356e9b4c5f4453a87a15ee7e2d6367..512901867ef1cfc5bc5ec4dc49891dc115c8b155 100644 (file)
@@ -10,9 +10,9 @@ import org.argeo.api.cms.directory.CmsGroup;
 import org.argeo.api.cms.directory.CmsUser;
 import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.directory.HierarchyUnit;
-import org.argeo.app.ui.SuiteIcon;
-import org.argeo.app.ui.SuiteMsg;
 import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteMsg;
 import org.argeo.cms.CurrentUser;
 import org.argeo.cms.acr.ContentUtils;
 import org.argeo.cms.auth.CmsRole;
index 33160315871f7793c33d9167c390259a46030e68..8a2059f75e506832d13cf0367f532aefcf2a2de8 100644 (file)
@@ -11,7 +11,7 @@ import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.directory.HierarchyUnit;
 import org.argeo.api.cms.directory.UserDirectory;
 import org.argeo.api.cms.ux.CmsIcon;
-import org.argeo.app.ui.SuiteIcon;
+import org.argeo.app.ux.SuiteIcon;
 import org.argeo.cms.CurrentUser;
 import org.argeo.cms.acr.ContentUtils;
 import org.argeo.cms.auth.CmsRole;
index e39ba0a5e13901c1fd412ea42514bfbe0feedeef..b651efa90efc4d6dbe8e1edbd361cfc4293ea6a6 100644 (file)
@@ -13,8 +13,8 @@ import org.argeo.api.acr.ldap.LdapObj;
 import org.argeo.api.cms.directory.CmsGroup;
 import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.directory.HierarchyUnit;
-import org.argeo.app.ui.SuiteMsg;
 import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.app.ux.SuiteMsg;
 import org.argeo.cms.swt.dialogs.CmsFeedback;
 import org.argeo.cms.swt.widgets.SwtGuidedFormPage;
 import org.argeo.cms.ux.widgets.AbstractGuidedForm;
index 5a73b1b15f6000cd13e1b272dd81d42e8cd3b5a9..d70c82a232662e03cc17cded315963c3030d49af 100644 (file)
@@ -15,8 +15,8 @@ import org.argeo.api.cms.directory.CmsUser;
 import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.directory.HierarchyUnit;
 import org.argeo.app.core.SuiteUtils;
-import org.argeo.app.ui.SuiteMsg;
 import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.app.ux.SuiteMsg;
 import org.argeo.cms.swt.dialogs.CmsFeedback;
 import org.argeo.cms.swt.widgets.SwtGuidedFormPage;
 import org.argeo.cms.ux.widgets.AbstractGuidedForm;
index f7141a4ecb8386f16a466a158ff7562d9896fc82..5a9a3d6688862091b22b294bab0aeba844df45db 100644 (file)
@@ -10,9 +10,9 @@ import org.argeo.api.acr.ldap.LdapAttr;
 import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.directory.HierarchyUnit;
 import org.argeo.api.cms.ux.CmsView;
-import org.argeo.app.ui.SuiteIcon;
-import org.argeo.app.ui.SuiteMsg;
-import org.argeo.app.ui.SuiteUxEvent;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteMsg;
+import org.argeo.app.ux.SuiteUxEvent;
 import org.argeo.cms.CurrentUser;
 import org.argeo.cms.acr.ContentUtils;
 import org.argeo.cms.auth.CmsRole;
index 8a22a10e55d0eddd417f2cf185ff5d538377f00b..a658898ffa17ac0a5da151816130fb1c2ca9ba17 100644 (file)
@@ -14,9 +14,9 @@ import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.directory.HierarchyUnit;
 import org.argeo.api.cms.directory.HierarchyUnit.Type;
 import org.argeo.app.api.SuiteRole;
-import org.argeo.app.ui.SuiteMsg;
-import org.argeo.app.ui.SuiteStyle;
 import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.app.ux.SuiteMsg;
+import org.argeo.app.ux.SuiteStyle;
 import org.argeo.cms.CmsMsg;
 import org.argeo.cms.CurrentUser;
 import org.argeo.cms.Localized;
index 9dae8a4f7e51da22aeb55616ad33e87de649bb4c..2214a15689196c7b0a3b6723a01cbcd90ad5b706 100644 (file)
@@ -5,7 +5,7 @@ import org.argeo.api.acr.ldap.LdapAcrUtils;
 import org.argeo.api.acr.ldap.LdapAttr;
 import org.argeo.api.acr.ldap.LdapObj;
 import org.argeo.api.cms.ux.CmsIcon;
-import org.argeo.app.ui.SuiteIcon;
+import org.argeo.app.ux.SuiteIcon;
 import org.argeo.cms.CurrentUser;
 import org.argeo.cms.auth.UserAdminUtils;
 import org.argeo.cms.ux.widgets.Column;